所以我有一个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做到这一点?
答案 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; }
}
}