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

eiee3dmh  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(164)

我有一个JSON文件,其中嵌套了一个对象,如下所示:

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

有时,嵌套在JSON中的对象可能为空。

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

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

  • MyObject
  • 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来完成这个任务?

fkaflof6

fkaflof61#

我用你上面提供的东西做了一个小测试,发现MyObject和Message之间缺少了一个逗号。除此之外,一切都很好。通过debug检查对象,会显示所有的解析都正常。

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; }
    }
}

相关问题