Newtonsoft избежал JSON-строки, которая не может быть десерализована до объекта - PullRequest
0 голосов
/ 30 августа 2018

Справочная информация:

Я получаю ответ JSON через HttpResponseMessage, как показано:

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 голосов
/ 30 августа 2018

Вы можете просто удалить строку json обратно в обычную строку и затем использовать DeserializeObject

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

 jsonString = Regex.Unescape(jsonString); //almost there
 jsonString = jsonString.Remove(jsonString.Length - 1, 1).Remove(0,1); //remove first and last qoutes
 SimpleModel simpleModel = JsonConvert.DeserializeObject<SimpleModel>(jsonString);
0 голосов
/ 30 августа 2018

У вас 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 этот метод снова сериализует ваш результат, который уже сериализован.

...