【问题标题】:Newtonsoft json is not deserializing when the name of the class is the root element当类的名称是根元素时,Newtonsoft json 不会反序列化
【发布时间】:2020-01-26 06:48:07
【问题描述】:

当类的名称是根元素时,Newtonsoft json DeserializeObject 不解析 json 消息。

var json = "  {\r\n \"amount\": {\r\n    \"currency\": \"EUR\",\r\n    \"value\": 99792\r\n  }\r\n}";
var amount = JsonConvert.DeserializeObject<Amount>(json)

和班级

class Amount 
{
    [JsonProperty("value")]
    public decimal? Value { get; set; }

    [JsonProperty("currency")]
    public string Currency { get; set; }
}

在这种情况下,Amount 属性为null。问题是金额嵌套在更复杂的json中,我发现它总是返回空,因为它以“金额”开头。当然,我在 Amount 类中尝试了一些注释,例如 [DataContract] 和 [JsonObject] 但它仍然是空的 在以下情况下:

 var json = "{\r\n    \"currency\": \"EUR\",\r\n    \"value\": 99792\r\n }";

然后被正确解析。问题是如何在第一种情况下反序列化 json?

【问题讨论】:

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


    【解决方案1】:

    你应该像这样为你的类建模:

    public class Amount
    {
        [JsonProperty("value")]
        public decimal? Value { get; set; }
    
        [JsonProperty("currency")]
        public string Currency { get; set; }
    }
    
    public class RootObject
    {
        [JsonProperty("amount")]
        public Amount Amount { get; set; }
    }
    

    然后反序列化RootObject:

    var amount = JsonConvert.DeserializeObject<RootObject>(json);
    

    注意:您可以将 JSON 粘贴到 json2csharp.com,它会为您将 JSON 建模为 C# 类。

    【讨论】:

      【解决方案2】:

      您可以创建一个包装类Root,它有一个名为Amount 的元素。例如,

      public class Root
      {
          [JsonProperty("amount")]
          public Amount Amount { get; set; }
      }
      

      您现在需要反序列化为Root 的实例。例如,

      var amount = JsonConvert.DeserializeObject<Root>(json);
      

      或者,如果你不想声明另一个类,你也可以使用

      var innerJson = JObject.Parse(json)["amount"].ToString();
      var amount = JsonConvert.DeserializeObject<Amount>(innerJson);
      

      【讨论】:

        【解决方案3】:

        如何在第一种情况下反序列化 json

        您的 json 未正确反序列化的原因是 Newtonsoft 不知道如何将 amount 转换为具有两个变量的类,命名为:currencyvalue。要在第一种情况下反序列化 json,您需要第一个对象的类:amount。此对象包含另一个与您正在使用的类匹配的对象,Amount

        当您添加缺少的类 RootObject 并反序列化到该 RootObject 时,您将看到正确反序列化的 json。

        你需要的课程

        public class Amount
        {
            [JsonProperty("currency")]
            public string Currency { get; set; }
            [JsonProperty("value")]
            public int Value { get; set; }
        }
        
        public class RootObject
        {
            [JsonProperty("amount")]
            public Amount Amount { get; set; }
        }
        

        将其用于反序列化

        var amount = JsonConvert.DeserializeObject<RootObject>(json)
        

        轻松找到课程

        我发现www.json2csharp.com 是一个很好的资源。如有疑问,请将您的 json 复制/粘贴到那里以获得您需要的所有类。将它们复制到您的项目中并反序列化为 RootObject。如果您的 JSON 无效,您也会发现那里有什么问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-22
          • 2013-06-06
          • 1970-01-01
          相关资源
          最近更新 更多