【问题标题】:JSON.NET Root Tag and DeserializationJSON.NET 根标记和反序列化
【发布时间】:2011-09-04 12:44:08
【问题描述】:

我从 Java 服务返回以下 JSON

  {"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);

我发现我必须将 Test 类包装在另一个类中才能正常工作。除了

之外,有没有一种简单的方法可以避免这种情况?
JToken root = JObject.Parse(jsonString);
JToken testToken = root["Test"];
Test deserializedTest = JsonConvert.DeserializeObject<Test>(testToken.toString());

最后我有第二个问题。我调用的大多数服务也可以返回一个异常对象。我想我会阅读 JSON 的“根”标签来确定如何反序列化对象。如何获取第一个根标记和/或是否有更好、更优雅的方法来处理服务异常?

谢谢

【问题讨论】:

    标签: c# serialization json.net


    【解决方案1】:

    遇到了同样的问题,真的很想摆脱这个“容器”,找到了这个解决方案,尽管您需要使用额外的字符串来查找根对象:

    // 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>();
    

    【讨论】:

      【解决方案2】:

      响应实际上是一个包含Test 对象的对象。所以你的对象模型应该看起来一样。由于响应可能包含异常,因此您也应该反映这一点:

      class Response
      {
          public Test Test { get; set; }
          public JObject Exception { get; set; }
      }
      

      这假设您不知道Exception 的外观。如果这样做,请使用具体类型而不是 JObject。然后您可以根据Exception 是否为null 来处理Response 对象。

      【讨论】:

      • 我认为如果我将它设为通用对象(用于测试对象),这实际上可能会很好地工作。这是解析一个或其他对象的一种非常简单的方法。谢谢
      【解决方案3】:

      如果您不想创建包装类型,可以使用匿名类型:

      var test = 
        JsonConvert.DeserializeAnonymousType(response.Content, new { Test = new Test()}).Test;
      

      如果您有更多属性,例如异常,则最好创建一个包装器类型。

      【讨论】:

        【解决方案4】:

        只需编写一个包装器:

        public class Wrapper
        {
            public Test Test { get; set; }
        }
        

        然后反序列化到这个包装器并通过Test 属性获取Test 实例:

        Test deserializedTest = JsonConvert.DeserializeObject<Wrapper>(jsonString).Test;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-18
          相关资源
          最近更新 更多