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

时间:2018-08-30 11:04:03

标签: c# json json.net deserialization json-deserialization

问题背景:

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

var jsonString= response.Content.ReadAsStringAsync().Result;

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

"\"{\\\"A\\\":\\\"B\\\"}\""

问题:

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

SimpleModel simpleModel= JsonConvert.DeserializeObject<SimpleModel>(jsonString);

SimpleModel的类模型:

 public class SimpleModel
 {
     public string A { set; get; }
 }

该转换给我以下错误:

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.

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

2 个答案:

答案 0 :(得分:0)

您的json两次出现serialize

1),因此您必须先反序列化为字符串,然后再次将其反序列化为SimpleModel,就像

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

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

SimpleModel simpleModel = JsonConvert.DeserializeObject<SimpleModel>(firstDeserialize); 

输出:

enter image description here

2)如果不想两次反序列化,则将json解析为JToken,然后再次将其解析为JObject

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

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

SimpleModel simpleModel = jObject.ToObject<SimpleModel>();

输出:

enter image description here

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

答案::当您从HttpResponseMessage返回结果时,您成功地序列化了结果,并从ReadAsStringAsync读取了结果之后,此方法再次序列化了已经序列化的结果。

答案 1 :(得分:0)

您可以将json字符串重新解散为普通字符串,然后使用async

DeserializeObject