Запрос или десериализация json с динамическими ключами c с использованием System.Text. Json - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть json, который выглядит следующим образом, ключ "123" может быть любым числом.

 {
   "key1": "",
   "key2": {
      "items": {
         "123": {
            "pageid": 123,
            "name": "data"
         }
      }
    }
 }

Я хочу десериализовать или запросить json с помощью System.Text. Json так что я могу получить значение ключа «имя». Как я могу сделать это с System.Text. Json? Я использую. NET Core 3.1.

Ответы [ 3 ]

1 голос
/ 06 февраля 2020

Поскольку одна из клавиш json может различаться ("123"), это может быть представлено Dictionary<>. Следующие классы моделируют ваш json.

public class ItemProps
{
    public int pageid { get; set; }
    public string name { get; set; }
}

public class Item
{
    public Dictionary<string, ItemProps> items { get; set; }
}

public class Root
{
    public string key1 { get; set; }
    public Item key2 { get; set; }
}

Затем для десериализации с помощью System.Text.Json вы должны использовать:

var data = JsonSerializer.Deserialize<Root>(json);

Для доступа name:

var name = data.key2.items["123"].name

Попробуйте онлайн

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

1 голос
/ 06 февраля 2020

Что-то вроде:

public class Rootobject
{
    public string key1 { get; set; }
    public InnerObject key2 { get; set; }
}

public class InnerObject 
{
    public Dictionary<string, ObjectTheThird> items { get; }
        = new Dictionary<string, ObjectTheThird>();
}

public class InnerObject 
{
    public int pageid { get; set; }
    public string name { get; set; }
}

и используйте API на Dictionary<,> для просмотра предметов. Или вы просто хотите первое:

var name = obj.key2.items.First().Value.name;
0 голосов
/ 06 февраля 2020

Я не признаю свой подход, но если вам нужен короткий путь, вы можете обмануть следующим образом:

var str = "{'key1': '','key2': {'items': {'123': {'pageid': 123,'name': 'data'}}}}";
var res = str.Split(@"name':")[1].Split("'")[1];

Это избавит вас от большого количества работы, но это небезопасно, вы можете решить, использовать его в соответствии с разнообразием json формат будет.

...