Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反序列化包含转义JSON字符串的属性?_C#_Json.net - Fatal编程技术网

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

C# 如何反序列化包含转义JSON字符串的属性?,c#,json.net,C#,Json.net,我有一个API的application/json响应,该API本身有一个属性,包含一个转义的json字符串 { "id": 0, "aggregation_id": "533741f4-49da-4db9-9660-4ca7bafb30e1", "task_id": "217", "event_type": "discovery", "event_name": "device_discovery_complete", "method": "ssh"

我有一个API的
application/json
响应,该API本身有一个属性,包含一个转义的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>("... response string...");

您可以使用自定义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
可能应该变得更智能,以便真正通用

您可以使用自定义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
可能应该变得更智能,以便真正通用

在转换之前是否尝试过从序列化的json中删除\?如果可能的话,我希望避免预处理响应字符串。如果有什么方法可以告诉Newtonsoft.Json如何处理嵌套的Json字符串,您的问题是
“message\u details”
实际上是作为字符串嵌入的序列化Json。如果无法修复传入的JSON,可以使用来自的
EmbeddedLiteralConverter
。我希望避免预处理,您可以进行预处理或后处理。没有别的办法。对于后期处理,您将
MessageDetails
设置为字符串,添加另一个属性,如
messagedetailsSerialized
,对对象进行反序列化,然后将
MessageDetails
反序列化为
messagedetailsSerialized
。啊,我的问题如何被标记为带有否定点的问题的副本?!我是从端到端类型序列化的角度提出的,另一个问题是关于首先清理输入字符串的问题。观点很重要!在转换之前是否尝试过从序列化的json中删除\?如果可能的话,我希望避免预处理响应字符串。如果有什么方法可以告诉Newtonsoft.Json如何处理嵌套的Json字符串,您的问题是
“message\u details”
实际上是作为字符串嵌入的序列化Json。如果无法修复传入的JSON,可以使用来自的
EmbeddedLiteralConverter
。我希望避免预处理,您可以进行预处理或后处理。没有别的办法。对于后期处理,您将
MessageDetails
设置为字符串,添加另一个属性,如
messagedetailsSerialized
,对对象进行反序列化,然后将
MessageDetails
反序列化为
messagedetailsSerialized
。啊,我的问题如何被标记为带有否定点的问题的副本?!我是从端到端类型序列化的角度提出的,另一个问题是关于首先清理输入字符串的问题。观点很重要!