Таким образом, у меня есть файл JSON, у которого есть объект, вложенный в него. Это выглядит так:
{ "MyObject" : { "prop1": "Value1", "prop2" : "Value2"}
"Message" : "A message"}
Иногда объект, вложенный внутри JSON, может быть нулевым. Так, например,
{ "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 десериализовывался до нуля. Поэтому, когда код запускается, конечным результатом является 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; }
}
}
{ "MyObject" : { "prop1": "Value1", "prop2" : "Value2"}, "Message" : "A message"}
и{ "MyObject" : null, "Message" : "A message"}
, Исправив это, я могу успешно десериализовать обе строки JSON. Можете ли вы сделать минимальный, полный и проверяемый пример вашей проблемы?