Десериализовать вложенный JSON в класс C # - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть такой класс JSON

{
    "Items": {
        "Item_1A": {
            "prop1": "string",
            "prop2": "string",
            "prop3": 1,
            "prop4": [{
                "prop_x": 100
            },
            {
                "prop_y": 200
            }]
        },
        "Item2B": {
            "prop1": "string",
            "prop2": "string",
            "prop3": 14,
            "prop4": [{
                "prop_z": 300
            }]
        }
    }
}

Как я могу превратить это в классы C #? Вот что у меня так далеко:

public class Info
{
    public string prop1 {get;set;}
    public string prop2 {get;set;}
    public int prop3 {get;set;}
    public Dictionary<string, List<int>> prop4 {get;set;}
}
public class Response
{
    public Dictionary<string, List<Info>> Item {get;set;}
}

Я пытался перейти по этой ссылке, но не получилось Десериализация вложенного JSON в объекты C #

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Ваша модель данных должна быть следующей:

public class Info
{
    public string prop1 {get;set;}
    public string prop2 {get;set;}
    public int prop3 {get;set;}
    // Modified from 
    //public Dictionary<string, List<int>> prop4 {get;set}
    public List<Dictionary<string, int>> prop4 {get;set;}
}

public class Response
{
    // Modified from 
    //public class Dictionary<string, List<Info>> Item {get;set;}
    public Dictionary<string, Info> Items {get;set;}
}

Примечания:

  • Response.Item должен был быть назван Items.

  • В вашем JSON "Items" - это объект с переменно-названными объектно-значимыми свойствами:

    {
        "Items": {
            "Item_1A": { },
            "Item2B": { }
        }
    }
    

    Это должно быть смоделировано как Dictionary<string, T> для соответствующего не-типа сбора T. Предполагая, что вы используете , см. Руководство по сериализации: Словари для получения подробной информации. Если нет, ведет себя аналогично.

    Ваша модель данных, public class Dictionary<string, List<Info>> Items, была бы подходящей для объекта с переменным именем массива свойств:

    {
        "Items": {
            "Item_1A": [{ },{ }],
            "Item2B": [{ }]
        }
    }
    

    Но это не то, что у вас есть.

  • Между тем "prop4" - это массив , содержащий объект с переменными именованными объектно-значимыми свойствами, такими как:

    "prop4": [ // Outer container is an array
      {        // Inner container is an object
        "prop_x": 100
      },
      {
        "prop_y": 200
      }
    ]
    

    Таким образом, коллекция, такая как List<T>, должна использоваться как универсальный тип external :

    public List<Dictionary<string, int>> prop4 {get;set;}
    

    См. Руководство по сериализации: IEnumerable, Lists and Arrays .

  • Как вы заметили, инструменты генерации кода, такие как упомянутые в Как автоматически генерировать файл класса C # из строки объекта JSON , как правило, не могут распознавать JSON объекты с именами переменных свойств. В такой ситуации автоматически сгенерированный класс может потребоваться заменить вручную соответствующим свойством Dictionary<string, T> в содержащем типе.

Пример рабочей скрипки здесь .

0 голосов
/ 13 сентября 2018

Просто небольшие изменения в вашей модели. Ваш prop4 - это список или массив.

public class Info
{
  public string prop1 {get;set;}
  public string prop2 {get;set;}
  public int prop3 {get;set;}
  public List<Dictionary<string, List<int>>> prop4 {get;set}
}
public class  Response
{
  public class Dictionary<string, Info> Items {get;set;} // Should be named Items
}
0 голосов
/ 13 сентября 2018

Ваш prop4 - это Dictionary<string, List<int>>, который при сериализации выглядит примерно так (для краткости я пропустил $type свойства в испускаемом JSON):

{
   "X": {
      "$values": [ 1, 2 ]
   },
   "Y": {
      "$values": [ 3, 4 ]
   }    
}

Ваш JSON, хотя он и хорошо сформирован, "неправильно сформирован". Это больше похоже на массив, содержащий словарь одного элемента.

В приведенном выше JSON X и Y - это ключи в словаре, который является "обычным объектом", смоделированным в JSON. $values представляет список целых чисел для каждого ключа.

0 голосов
/ 13 сентября 2018

Вот совет по созданию прокси-классов после json:

Прежде всего, чтобы убедиться, что это действительный JSON, перейдите на этот сайт и запустите валидатор: https://jsonlint.com/

Если все в порядке, есть некоторые инструменты, которые преобразуют json и xml в прокси-класс ac #, например: http://json2csharp.com/: https://xmltocsharp.azurewebsites.net/

Теперь все готово!просто скопируйте их в свою модель и начните использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...