Как десериализовать нулевой объект JSON, используя Newtonsoft.Json?

1

Таким образом, у меня есть файл 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?

  • 2
    Ваш JSON искажен - вам нужна запятая между двумя свойствами корневого объекта. Т.е. { "MyObject" : { "prop1": "Value1", "prop2" : "Value2"}, "Message" : "A message"} и { "MyObject" : null, "Message" : "A message"} , Исправив это, я могу успешно десериализовать обе строки JSON. Можете ли вы сделать минимальный, полный и проверяемый пример вашей проблемы?
Теги:
deserialization
json.net

1 ответ

3

Я создал небольшой тест с тем, что вы указали выше, и обнаружил, что у 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; }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню