Ошибка десериализации файла JSON в Visual Studio - PullRequest
0 голосов
/ 25 февраля 2020

У меня возникают трудности при попытке извлечь данные из следующей таблицы JSON:

    [
    {"type":"header","version":"4.8.3","comment":"Export to JSON plugin for PHPMyAdmin"},
    {"type":"database","name":"archaism_dictionary"},
    {"type":"table","name":"dictionary","database":"archaism_dictionary","data":
    [
    {"id":"0","word":"wordOne","synonym":null,"definition":"defOne"},
    {"id":"1","word":"wortTwo","synonym":null,"definition":"defTwo"}
    ]
    }
    ]

Моя цель - получить строковый вывод для каждого "слова" и каждого "определения". У меня есть следующий класс, который соответствует JSON файлу:

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string type { get; set; }
    public string version { get; set; }
    public string comment { get; set; }
    public string name { get; set; }
    public string database { get; set; }
    public Datum[] data { get; set; }
}

public class Datum
{
    public string id { get; set; }
    public string word { get; set; }
    public object synonym { get; set; }
    public string definition { get; set; }
}

Наконец, этот фрагмент кода должен извлечь первое слово из таблицы в строковом результате:

var list = JsonConvert.DeserializeObject<List<Dictionary.Rootobject>>(rawJSON);
string result = list[0].Property1[0].data[0].word;

.Property [0] возвращает ноль, и программа выдает исключение нулевой ссылки. Где мой код неисправен и как мне выполнить эту задачу? Спасибо.

РЕДАКТИРОВАТЬ: Я не уверен, может ли это испортить необработанную строку JSON, но я получаю это так:

rawJSON = File.ReadAllText(FileSystem.AppDataDirectory + fileName);

Ответы [ 3 ]

0 голосов
/ 26 февраля 2020

@ Клаудио Валерио предоставил правильные данные json.

На основании моего теста вы можете попробовать следующий код, чтобы получить word в списке.

Json daya:

{
"Property1":[
{"type":"header","version":"4.8.3","comment":"Export to JSON plugin for PHPMyAdmin"},
{"type":"database","name":"archaism_dictionary"},
{"type":"table","name":"dictionary","database":"archaism_dictionary","data":
  [
    {"id":"0","word":"wordOne","synonym":null,"definition":"defOne"},
    {"id":"1","word":"wortTwo","synonym":null,"definition":"defTwo"}
  ]
  }
 ]
}

Класс из JSON данные:

 public class Rootobject
{
    public Property1[] Property1 { get; set; }
}

public class Property1
{
    public string type { get; set; }
    public string version { get; set; }
    public string comment { get; set; }
    public string name { get; set; }
    public string database { get; set; }
    public Datum[] data { get; set; }
}

public class Datum
{
    public string id { get; set; }
    public string word { get; set; }
    public object synonym { get; set; }
    public string definition { get; set; }
}

Код:

  string rawJSON = @"{
  'Property1':[
    {'type':'header','version':'4.8.3','comment':'Export to JSON plugin for PHPMyAdmin'},
   {'type':'database','name':'archaism_dictionary'},
   {'type':'table','name':'dictionary','database':'archaism_dictionary','data':
   [
    {'id':'0','word':'wordOne','synonym':null,'definition':'defOne'},
     {'id':'1','word':'wortTwo','synonym':null,'definition':'defTwo'}
  ]
  }
 ]
}";
        var list = JsonConvert.DeserializeObject<Rootobject>(rawJSON);
        string result = list.Property1[2].data[0].word;

enter image description here

0 голосов
/ 26 февраля 2020

Вам нужен нулевой дескриптор (json NullValueHandling) ниже мой код, пожалуйста, посмотрите:

string stringJson = @"{
                              'Property1':[
                                {'type':'header','version':'4.8.3','comment':'Export to JSON plugin for PHPMyAdmin'},
                               {'type':'database','name':'archaism_dictionary'},
                               {'type':'table','name':'dictionary','database':'archaism_dictionary','data':
                               [
                                {'id':'0','word':'wordOne','synonym':null,'definition':'defOne'},
                                 {'id':'1','word':'wortTwo','synonym':null,'definition':'defTwo'}
                              ]
                              }
                             ]
                            }";

        try
        {
            var settings = new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore,
                MissingMemberHandling = MissingMemberHandling.Ignore
            };
            var list = JsonConvert.DeserializeObject<BaseResponse>(stringJson,settings);
            string result = list.Property1[2].data[0].word;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

Модели:

public class WordData
{
    public string id { get; set; }
    public string word { get; set; }
    public object synonym { get; set; }
    public string definition { get; set; }
}

public class PropertyData
{
    public string type { get; set; }
    public string version { get; set; }
    public string comment { get; set; }
    public string name { get; set; }
    public string database { get; set; }
    public List<WordData> data { get; set; }
}

public class BaseResponse
{
    public List<PropertyData> Property1 { get; set; }
}

Я надеюсь, что это поможет вам

Спасибо

0 голосов
/ 26 февраля 2020

Скорее всего, ваш ввод json выглядит примерно так:

[
{"type":"header","version":"4.8.3","comment":"Export to JSON plugin for PHPMyAdmin"},
{"type":"database","name":"archaism_dictionary"},
{"type":"table","name":"dictionary","database":"archaism_dictionary","data":
[
{"id":"0","word":"wordOne","synonym":null,"definition":"defOne"},
{"id":"1","word":"wortTwo","synonym":null,"definition":"defTwo"}
]

Обратите внимание на квадратные скобки, они важны.

Если я правильно угадал, вы ' захочу десериализовать так:

var list = JsonConvert.DeserializeObject<List<Class1>>(rawJSON);
string result = list[2].data[0].word;

Примечание: ваш исходный код будет работать, только если вы введете json:

{
  "Property1":[
    {"type":"header","version":"4.8.3","comment":"Export to JSON plugin for PHPMyAdmin"},
    {"type":"database","name":"archaism_dictionary"},
    {"type":"table","name":"dictionary","database":"archaism_dictionary","data":
      [
        {"id":"0","word":"wordOne","synonym":null,"definition":"defOne"},
        {"id":"1","word":"wortTwo","synonym":null,"definition":"defTwo"}
      ]
    }
  ]
}

и используете

var myRoot = JsonConvert.DeserializeObject<RootObject>(rawJSON);
string result = myRoot.Property1[2].data[0].word;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...