如何使用Newtonsoft.Json反序列化null JSON对象?

时间:2015-03-25 22:45:45

标签: c# json json.net deserialization

所以我有一个JSON文件,其中嵌套了一个对象。它看起来像这样:

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

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

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

我正在尝试使用Newtonsoft.Json将此对象反序列化为一个对象(让我们称之为JsonObject),该对象具有两个属性:“MyObject”和“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; }

JsonObject看起来像这样:

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

我的反序列化代码如下所示:

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

但这是一个错误:

Exception: Object reference not set to an instance of an object

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

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

我想要的是MyObject反序列化为null。因此,当代码运行时,最终结果是一个JsonObject,MyObject = null,Message =“sample message”。我如何使用Newtonsoft.Json做到这一点?

1 个答案:

答案 0 :(得分:3)

我使用您在上面提供的内容创建了一个小测试,发现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; }
    }
}