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



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

的结果有一个问题,苹果和橙子水果null而不是它们的属性颜色大小

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

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

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

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

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

问题是 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);

JSON 字符串应为:

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

使用类进行反序列化

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

相关内容

  • 没有找到相关文章

最新更新