JSON. NET "ссылка на объект не установлена ​​для экземпляра объекта" - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь десериализовать HTTP-ответ JSON, но получаю сообщение об ошибке "ссылка на объект не установлена ​​на экземпляр объекта".

Я знаю, что это часто задаваемый вопрос, но ничего, что я нашел об ошибке, не помогло мне. Я думаю, что мне не хватает чего-то очень базового c.

Ответ JSON, который я получаю, выглядит примерно так:

{
 "value": [
        {
            "createdDateTime": "2020-03-14T12:25:54Z",
            "id": "W2RQ6DOBCJUXWGR35DLKP7UI6IN",
            "name": "somename",
            "size": 200230,
        },
        {
            "createdDateTime": "2020-03-24T08:25:03Z",
            "id": "Q6DOBCJUXWFIGR35DLWERKP7UI6IN",
            "name": "somename",
            "size": 200230,
        },

        ...
   ]
}

Мне уже удалось десериализовать свойства, которые только происходят один раз в ответе. Однако на этот раз мне нужны свойства "id" и "name" назад. Вот как я это попробовал:

 public class Value
        {
            public string Name { get; set; }
            public string Id { get; set; }
            public Value[] Children { get; set; }
        }
        public class RootObject
        {
            public Value[] RespValues { get; set; }
        }

var objJSON = JObject.Parse(jsonresponse);
var objResponse = objJSON["Response"].ToString();

RootObject categoryTree = JsonConvert.DeserializeObject<RootObject>(objResponse);

До сих пор я пробовал несколько разных подходов, но каждый из них вызывал ошибку. Я не совсем уверен, что я делаю не так.

1 Ответ

1 голос
/ 03 апреля 2020

В этой строке var objResponse = objJSON["Response"].ToString(); вы пытаетесь получить значение "Response" из вашего json, но у вас нет поля с именем "Response"

Также в вашем классе RootObject у вас есть RespValue свойство, но ваш json равен "value", вы должны сделать так, чтобы это 2 поля имело одинаковое имя. либо вы изменяете свойство вашего класса на @value или json на "respValue"

, затем, если вы хотите разобрать это json, вы можете использовать это

var objJSON = JsonConvert.DeserializeObject<RootObject>(json);

чтобы получить доступ к его значению, вы можете использовать индекс массива или foreach l oop из yout objJSON variable

Вот мой полный код, основанный на вашем вопросе

public class Value
{
    public string Name { get; set; }
    public string Id { get; set; }
    public Value[] Children { get; set; } // will always null
}
public class RootObject
{
    public Value[] @value { get; set; } // Your json's field named value
}

public static void Main()
{
    string jsonexample = @"{""value"": [
                                        {
                                            ""createdDateTime"": ""2020-03-14T12:25:54Z"",
                                            ""id"": ""W2RQ6DOBCJUXWGR35DLKP7UI6IN"",
                                            ""name"": ""somename"",
                                            ""size"": 200230,
                                        },
                                        {
                                            ""createdDateTime"": ""2020-03-24T08:25:03Z"",
                                            ""id"": ""Q6DOBCJUXWFIGR35DLWERKP7UI6IN"",
                                            ""name"": ""somename"",
                                            ""size"": 200230,
                                        }
                                   ]
                                }";
    var objJSON = JsonConvert.DeserializeObject<RootObject>(jsonexample);

    Console.WriteLine(objJSON.value[0].Name);

    foreach(var item in objJSON.value)
    {
        Console.WriteLine(item.Id);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...