如何反序列化包含转义的JSON字符串的属性?

我有一个API的application/json响应,它有一个属性,本身包含一个转义的JSON字符串。

 { "id": 0, "aggregation_id": "533741f4-49da-4db9-9660-4ca7bafb30e1", "task_id": "217", "event_type": "discovery", "event_name": "device_discovery_complete", "method": "ssh", "message_details": "{\"aggregation_id\":\"533741f4-49da-4db9-9660-4ca7bafb30e1\",\"ou_id\":0,\"device_id\":13,\"node_id\":13,\"task_id\":217}", "time": "2018-01-25T17:59:25" } 

我想将对象和内部对象反序列化为模型类型。

 public class Response { public DateTime time {get; set;} public string event_name {get; set;} public string event_type {get; set;} public string method {get; set;} public MessageDetails message_details {get; set;} } public class MessageDetails { public int device_id {get; set;} } 

使用这样的电话

 JsonConvert.DeserializeObject("... response string..."); 

但是,Netwonsoft.Json处理外部属性很好,但在匹配message_details抛出exception。

 Newtonsoft.Json.JsonSerializationException: Error converting value "... response string snipped ..." to type 'RpcApi.Entities.MessageDetails'. Path '[0].message_details', line 1, position 390. ---> System.ArgumentException: Could not cast or convert from System.String to RpcApi.Entities.MessageDetails. 

您可以使用自定义JsonConverter,类似于:

 public class EmbeddedJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return serializer.Deserialize(new StringReader((string)reader.Value), objectType); } public override bool CanConvert(Type objectType) { return true; } } 

使用[JsonConverter(typeof(EmbeddedJsonConverter))]标记属性,如:

 public class Response { public DateTime time { get; set; } public string event_name { get; set; } public string event_type { get; set; } public string method { get; set; } [JsonConverter(typeof(EmbeddedJsonConverter))] public MessageDetails message_details { get; set; } } 

然后,您将能够使用JsonConvert.DeserializeObject()反序列化。

EmbeddedJsonConverter类从对象中提取json字符串,然后对其进行反序列化。 CanConvert可能应该变得更聪明,以实现真正的通用用途。