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;