如何使用Newtonsoft.JSON反序列化空JSON对象



所以我有一个JSON文件,里面嵌套了一个对象

{ "MyObject" : { "prop1": "Value1", "prop2" : "Value2"}
  "Message" : "A message"}

有时,嵌套在JSON中的对象可能为null。例如,

{ "MyObject" : null
  "Message" : "A message"}

我正试图使用Newtonsoft.Json将这个对象反序列化为JsonObject的类型T,它有两个属性:

  • CCD_ 2和
  • Message

JsonObject看起来像这样:

public class JsonObject
{
   public MyObject MyObject { get; set; }
   public string Message { get; set; }
}

Message只是一个字符串,但MyObject是一个具有其他一些(私有)属性以及构造函数的对象:

public class MyObject
{
    public MyObject(string prop1, string prop2)
    {
        this.prop1= prop1;
        this.prop2= prop2;
    }
    public string prop1 { get; private set; }
    public string prop2 { get; private set; }
}

我要反序列化的代码如下:

using (StreamReader reader = new StreamReader(filename))
{
    string jsonFile = reader.ReadToEnd();
    return JsonConvert.DeserializeObject<JsonObject>(jsonFile);
}

但它抛出了一个错误:

异常:对象引用未设置为对象的实例

当MyObject对象为null时会发生这种情况。我打印了jsonFile,这是输出:

{"MyObject": null, "Message": "sample message"}

我想要的是让MyObject反序列化为null。因此,当代码运行时,最终结果是具有的JsonObject

  • MyObject = null
  • Message = "sample message"

如何使用Newtonsoft.Json来完成此操作?

我用上面提供的内容创建了一个小测试,发现MyObject和Message之间缺少一个逗号。除此之外,一切都很顺利。通过调试检查对象可以显示所有解析结果。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            const string json1 = "{ "MyObject" : { "prop1": "Value1", "prop2" : "Value2"}, "Message" : "A message"}";
            const string json2 = "{ "MyObject" : null, "Message" : "A message"}";
            var obj1 = JsonConvert.DeserializeObject<JsonObject>(json1);
            var obj2 = JsonConvert.DeserializeObject<JsonObject>(json2);
            Assert.IsInstanceOfType(obj1, typeof(JsonObject));
            Assert.IsInstanceOfType(obj2, typeof(JsonObject));
        }
    }

    public class MyObject
    {
        public MyObject(string prop1, string prop2)
        {
            this.prop1 = prop1;
            this.prop2 = prop2;
        }
        public string prop1 { get; private set; }
        public string prop2 { get; private set; }
    }
    public class JsonObject
    {
        public MyObject MyObject { get; set; }
        public string Message { get; set; }
    }
}

相关内容

  • 没有找到相关文章

最新更新