所以我有一个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; }
}
}