Newtonsoft 转义 JSON 字符串无法反序列化为对象

Dev*_*Dev 3 c# json json.net deserialization json-deserialization

问题背景:

我通过 HttpResponseMessage 接收到 JSON 响应,如下所示:

var jsonString= response.Content.ReadAsStringAsync().Result;
Run Code Online (Sandbox Code Playgroud)

这给了我以下简单的转义 JSON 字符串结果:

"\"{\\\"A\\\":\\\"B\\\"}\""
Run Code Online (Sandbox Code Playgroud)

问题:

我正在使用 Newtonsoft 尝试将其反序列化为模型:

SimpleModel simpleModel= JsonConvert.DeserializeObject<SimpleModel>(jsonString);
Run Code Online (Sandbox Code Playgroud)

的类模型SimpleModel

 public class SimpleModel
 {
     public string A { set; get; }
 }
Run Code Online (Sandbox Code Playgroud)

转换给了我以下错误:

An exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll but was not handled in user code
Additional information: Error converting value "{"A":"B"}" to type 'PyeWebClient.Tests.ModelConversionTests+SimpleModel'. Path '', line 1, position 15.
Run Code Online (Sandbox Code Playgroud)

我从任务结果收到的 JSON 是有效的,所以我无法理解导致转换错误的问题是什么,格式化 JSON 字符串以便将其转换为其 C# 模型类型的正确方法是什么?

er-*_*sho 9

你 json 出现了serialize两次。

1)所以你必须先反序列化成字符串,然后再反序列化成你SimpleModel喜欢的

string json = "\"{\\\"A\\\":\\\"B\\\"}\"";

string firstDeserialize = JsonConvert.DeserializeObject<string>(json);

SimpleModel simpleModel = JsonConvert.DeserializeObject<SimpleModel>(firstDeserialize); 
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

2)如果您不希望反序列化两次,然后分析你的JSON进入JToken,然后再解析它变成JObject

string json = "\"{\\\"A\\\":\\\"B\\\"}\"";

JToken jToken = JToken.Parse(json);
JObject jObject = JObject.Parse((string)jToken);

SimpleModel simpleModel = jObject.ToObject<SimpleModel>();
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

问题:它如何被序列化两次?

答:当您从HttpResponseMessage成功序列化结果中返回结果时,在读取此结果ReadAsStringAsync后,此方法再次序列化已序列化的结果。