JSON.NET корневой тег и десериализация
у меня есть следующий JSON, возвращающийся из службы Java
{"Test":{
"value": 1,
"message": "This is a test"
}}
у меня есть следующие в C# класс
class Test {
public int value { get; set; }
public String message { get; set; }
}
однако, поскольку корневой тег "Test" возвращается, я не могу напрямую десериализовать это с помощью
Test deserializedTest = JsonConvert.DeserializeObject<Test>(jsonString);
Я считаю, что мне нужно обернуть тестовый класс внутри другого класса, чтобы это сработало. Есть простой способ избежать этого, кроме
JToken root = JObject.Parse(jsonString);
JToken testToken = root["Test"];
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString());
наконец, у меня есть второй вопрос. Большинство услуг я звоню могут также Верните объект Exception. Я решил, что прочитал" корневой " тег JSON, чтобы определить, как десериализовать объект. Как получить первый корневой тег и / или есть ли лучший, более элегантный метод для обработки исключений из службы?
спасибо
4 ответов
Если вы не хотите создавать тип оболочки, вы можете использовать анонимный тип:
var test =
JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test;
Если у вас больше свойств, таких как исключение, вероятно, лучше создать тип оболочки.
имел ту же проблему и действительно хотел избавиться от этого "контейнера", нашел это решение, хотя вам нужно использовать дополнительную строку, чтобы найти корневой объект:
// Container I wanted to discard
public class TrackProfileResponse
{
[JsonProperty("response")]
public Response Response { get; set; }
}
// Code for discarding it
var jObject = JObject.Parse(s);
var jToken = jObject["response"];
var response = jToken.ToObject<Response>();
просто напишите обертку:
public class Wrapper
{
public Test Test { get; set; }
}
и затем десериализовать этот фантик и забрать Test
экземпляр через Test
свойства:
Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test;