【问题标题】:Serializing object with list of object arrays throws NullReferenceException using Json.NET使用 Json.NET 使用对象数组列表序列化对象会引发 NullReferenceException
【发布时间】:2021-03-14 10:42:39
【问题描述】:

所以我有很多数据只需要存储而不是配置,所以我决定将其作为 Json 存储在我的数据库中。

List<fooData[]> foo = new List<fooData[]>();
List<faaData[]> faa = new List<faaData[]>();
foreach(Choice c in choices) 
{ 
    foo.Add(getFooData(c)) // Returns IEnumerable<fooData>
    faa.Add(getFaaData(c)) // Returns IEnumerable<faaData>
}
var JsonThis = MyJsonObject 
{
    fooArray = foo.ToArray(),
    faaArray = faa.ToArray()
};

string JsonString = JsonConvert.SerializeObject(JsonThis, Formatting.Indented,
                 new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

很好,按预期工作。当我再次反序列化我的 Json 时,就会出现我的问题,无论是从数据库中获取还是在下一行执行,我都会在 fooData 和 faaData 的属性上抛出 NullReferenceException。

代码如下:

MyJsonObject obj = JsonConvert.DeserializeObject<MyJsonObject>(JsonString,
                 new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

JsonObject

[JsonObject(IsReference = true)]
public class MyJsonObject
{
    public fooData[][] foo { get; set; }
    public faaData[][] faa { get; set; }
}

faaData 和 fooData 99% 相同

[JsonObject(IsReference = true)]
public class faaData 
{
    public string faaString1 { get; set; }
    public string faaString2 { get; set; }
    public string faaString3 { get; set; }
}

序列化 JsonString 示例:

{
  "Foo": [
    [
      {
        "FooString1": "foo string 1",
        "FooString2": "foo string 2",
        "FooString3": "foo string 3"
      },
      {
        "FooString1": "foo string 4",
        "FooString2": "foo string 5",
        "FooString3": "foo string 6"
      }
    ],
    [
      {
        "FooString1": "foo string 1",
        "FooString2": "foo string 2",
        "FooString3": "foo string 3"
      },
      {
        "FooString1": "foo string 4",
        "FooString2": "foo string 5",
        "FooString3": "foo string 6"
      }
    ]
  ],
  "Faa": [
    [
      {
        "FaaString1": "faa string 1",
        "FaaString2": "faa string 2",
        "FaaString3": "faa string 3"
      },
      {
        "FaaString1": "faa string 4",
        "FaaString2": "faa string 5",
        "FaaString3": "faa string 6"
      }
    ],
    [
      {
        "FaaString1": "faa string 1",
        "FaaString2": "faa string 2",
        "FaaString3": "faa string 3"
      },
      {
        "FaaString1": "faa string 4",
        "FaaString2": "faa string 5",
        "FaaString3": "faa string 6"
      }
    ]
  ]
}

我的问题:是否不可能用对象数组的数组序列化 MyJsonObject 并将其返回到最初的相同对象中?还是我做错了什么?

【问题讨论】:

  • 您应该更正您的代码,使其至少能够编译。
  • 你能构建一个最小的可重现示例,包括 (1) MyJsonObject 的最小定义,(2) literal JSON 字符串和 (3) 对 @ 的调用987654327@ 失败了?

标签: c# json .net asp.net-mvc json.net


【解决方案1】:

当我们使用 JSON 时,这样的数据结构(对象数组数组)没有问题。

在你的代码中试试这个:

List<FooData[]> foo = new List<FooData[]>()
{
    new FooData[]
    {
        new FooData() { FooString1 = "foo string 1" , FooString2 = "foo string 2", FooString3 = "foo string 3" },
        new FooData() {FooString1 = "foo string 4" , FooString2 = "foo string 5", FooString3 = "foo string 6" }
    },
    new FooData[]
    {
        new FooData() { FooString1 = "foo string 1" , FooString2 = "foo string 2", FooString3 = "foo string 3" },
        new FooData() {FooString1 = "foo string 4" , FooString2 = "foo string 5", FooString3 = "foo string 6" }
    }
};

List<FaaData[]> faa = new List<FaaData[]>()
{
    new FaaData[]
    {
        new FaaData() { FaaString1 = "faa string 1" , FaaString2 = "faa string 2", FaaString3 = "faa string 3" },
        new FaaData() {FaaString1 = "faa string 4" , FaaString2 = "faa string 5", FaaString3 = "faa string 6" }
    },
    new FaaData[]
    {
        new FaaData() { FaaString1 = "faa string 1" , FaaString2 = "faa string 2", FaaString3 = "faa string 3" },
        new FaaData() {FaaString1 = "faa string 4" , FaaString2 = "faa string 5", FaaString3 = "faa string 6" }
    }
};

var JsonThis = new 
{
    Foo = foo.ToArray(),
    Faa = faa.ToArray()
};

string JsonString = JsonConvert.SerializeObject(JsonThis, Formatting.Indented,
                    new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });

var result = JsonConvert.DeserializeObject<MyJsonObject>(JsonString);

这是类的新定义。我尝试关注C# Coding Standards and Naming Conventions

public class MyJsonObject
{
    public FooData[][] Foo { get; set; }
    public FaaData[][] Faa { get; set; }
}

public class FooData
{
    public string FooString1 { get; set; }
    public string FooString2 { get; set; }
    public string FooString3 { get; set; }
}

public class FaaData
{
    public string FaaString1 { get; set; }
    public string FaaString2 { get; set; }
    public string FaaString3 { get; set; }
}

这是结果:

【讨论】:

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