Конвертировать динамический Json в нечто более конкретное - PullRequest
0 голосов
/ 16 октября 2018

Как я могу десериализовать JSON ниже в массив C # или что-то более управляемое.

{
  "data": [
    {
      "PropertyName": [
        {
          "Key1": "test",
          "Key2": "afafa"
        },
        {
          "Key1": "test",
          "Key2": "afafa"
        }
      ],
      "PropertyName2": [
        {
          "Key1": "test",
          "Key2": "afafa"
        },
        {
          "Key1": "test",
          "Key2": "afafa"
        }
      ]
    }
  ]
}

Он поставляется в виде динамического параметра, подобного этому:

public IActionResult SAve([FromBody] dynamic mapping)

Обычно я бысделать это конкретным классом, но PropertyName изменится на другие имена, поэтому мне нужно что-то гибкое.Его содержимое может быть конкретным, так как это всего лишь два свойства.

Я думаю, что оно может быть похоже на словарь.

Dictionary<string, ConcreteClass>()

Я просто не знаю, как его получитьв эту форму.

Редактировать.

Я пошел дальше и сделал предложение, но оно не работает

{{
  "data": [
    {
      "propertyName": [
        {
          "key1": 1,
          "key2": "1"
        },
        {
          "key1": 2,
          "key2": "2"
        }
      ]
    }
  ]
}}

Я попытался преобразовать вот так

 var ddd = JsonConvert.DeserializeObject<List<MappingDto>>(mapping.data.ToString());

это делает пустой объект в массиве.Если у меня нет его в коллекции, я получаю другую ошибку

 public class MappingDto
    {
        public List<Dictionary<string, List<Item>>> Items { get; set; }
    }

  public class Items
    {
        public string Key1{ get; set; }
        public string Key2{ get; set; }

    }

1 Ответ

0 голосов
/ 16 октября 2018

Для этого JSON конкретная структура класса, которая обрабатывает имена динамических свойств, как вы описали, выглядела бы так:

public class MappingDto
{
    public List<Dictionary<string, List<Item>>> Data { get; set; }
}

public class Item
{
    public string Key1 { get; set; }
    public string Key2 { get; set; }
}

Обязательно обновите сигнатуру вашего метода, чтобы использовать новый класс вместо dynamic:

public IActionResult SAve([FromBody] MappingDto mapping)

Затем вы можете получить доступ к таким данным (например):

foreach (var dict in mapping.Data)
{
    foreach (var kvp in dict)
    {
        Debug.WriteLine(kvp.Key);
        foreach (var item in kvp.Value)
        {
            Debug.WriteLine(" Key1: " + item.Key1); 
            Debug.WriteLine(" Key2: " + item.Key2); 
        }
    }
}

Fiddle: https://dotnetfiddle.net/OGylPh

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