【问题标题】:Deserialization of JSON.Net returns 'null'JSON.Net 的反序列化返回“null”
【发布时间】:2014-11-25 13:51:57
【问题描述】:

我正在使用 JSON.Net 反序列化 JSON 字符串。 JSON字符串是

string testJson = @"{
                    ""Fruits"": {
                        ""Apple"": {
                            ""color"": ""red"",
                            ""size"": ""round""                               
                        },
                        ""Orange"": {
                            ""Properties"": {
                                ""color"": ""red"",
                                ""size"": ""round"" 
                            }
                        }
                    }
                }";

我的代码是

public class Fruits
{
    public Apple apple { get; set; }
    public Orange orange { get; set; }
}

public class Apple
{
    public string color { get; set; }
    public string size { get; set; }            
}

public class Orange
{
    public Properties properties { get; set; }
}

public class Properties
{
    public string color { get; set; }
    public string size { get; set; }   
}   

我正在尝试使用以下代码对其进行反序列化

Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson);

我的 结果 有一个问题,即 FruitsAppleOrangenull 而不是它们的属性颜色尺寸

【问题讨论】:

  • 问题是最外面的{ ... }括号对应你的Fruits类型,而Fruits不包含名为Fruits的属性。尝试创建一个包含 Fruits 属性的容器类型,然后对其进行反序列化。
  • 或者另辟蹊径,将某些内容序列化为 JSON 以了解正确的格式。

标签: c# json json.net deserialization


【解决方案1】:

假设您无法更改 json,您需要创建一个具有 Fruits 属性的新 FruitsWrapper

public class FruitsWrapper
{
    public Fruits Fruits { get; set; }
}

并将 json 反序列化为 FruitsWrapper 的实例,而不是 Fruits

FruitsWrapper result = JsonConvert.DeserializeObject<FruitsWrapper>(testJson);

工作演示:https://dotnetfiddle.net/nQitSD

【讨论】:

    【解决方案2】:

    问题是您的 Json 中最外层的括号对应于您尝试反序列化的类型。

    所以这个:

    string testJson = @"{
                          ""Fruits"": { ... }
                        }";
    

    对应于 Fruits,因为这是您要反序列化的内容。

    string testJson = @"{
                          ""Fruits"": { ... }
                            ^--+-^
                               |
                               +-- this is assumed to be a property of this --+
                                                                              |
                                                     +------------------------+
                                                     |
                                                  v--+-v
    Fruits result = JsonConvert.DeserializeObject<Fruits>(testJson);
    

    但是,Fruits 类型没有名为 Fruits 的属性,因此没有任何内容被反序列化。

    如果无法更改 Json,则需要创建一个反序列化的容器类型,如下所示:

    public class Container
    {
        public Fruits Fruits { get; set; }
    }
    

    然后你可以反序列化它:

    Container result = JsonConvert.DeserializeObject<Container>(testJson);
    

    【讨论】:

      【解决方案3】:

      JSON 字符串应该是:

      string testJson = @"{ 
                              ""Apple"": {
                                  ""color"": ""red"",
                                  ""size"": ""round""},
                              ""Orange"": { 
                                  ""Properties"": {
                                      ""color"": ""red"",
                                      ""size"": ""round"" }
                                      }
                          }";
      

      用你的类反序列化

      【讨论】:

        【解决方案4】:

        您的 JSON 字符串不正确(正如其他人指出的那样),但我添加它是为了帮助您找到正确的格式。假设你有一个像这样的fruit 对象:

        var fruit = new Fruits
        {
            apple = new Apple { color = "red", size = "massive" },
            orange = new Orange { properties = new Properties { color = "orange", size = "mediumish" } }
        };
        

        然后您可以将其序列化为 JSON:

        var testJson = JsonConvert.SerializeObject(fruit);
        

        现在您可以看到序列化的输出将如下所示:(稍微格式化)

        {"apple":
            {"color":"red","size":"massive"},
         "orange":
            {"properties":
                {"color":"orange","size":"mediumish"}}}
        

        这将很容易反序列化回您的对象:

        fruit = JsonConvert.DeserializeObject<Fruits>(testJson);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 2014-09-05
          相关资源
          最近更新 更多