JSON.Net的反序列化返回' null'

时间:2014-11-25 13:51:57

标签: c# json json.net deserialization

我正在使用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);

我的结果中存在一个问题,水果 Apple 橙色null而不是属性颜色尺寸

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:2)

JSON字符串应为:

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

用你的班级反序列化

答案 2 :(得分:2)

问题在于Json中最外面的护腕对应于您尝试反序列化的类型。

所以这个:

string testJson = @"{
                      ""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 :(得分:0)

你的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);