Как десериализовать сложный JSON с динамическими ключами в ядре asp.net? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть этот сложный JSON, который выглядит следующим образом:

{
    "results": [
        {
            "statement_id": 0,
            "series": [
                {
                    "name": "test-name",
                    "tags": {
                        "tag1": "0"
                        "tag2": "1"
                    },
                    "columns": [
                        "time",
                        "mean"
                    ],
                    "values": [
                        [
                            "2018-12-03T10:18:37.3Z",
                            0
                        ]
                    ]
                }
            ]
        }
    ]
}

POCO для вышеупомянутого выглядит так:

public class Tags
{
    public string tag1 { get; set; }
    public string tag2 { get; set; }
}

public class Series
{
    public string name { get; set; }
    public Tags tags { get; set; }
    public List<string> columns { get; set; }
    public List<List<object>> values { get; set; }
}

public class Result
{
    public int statement_id { get; set; }
    public List<Series> series { get; set; }
}

public class RootObject
{
    public List<Result> results { get; set; }
}

Проблема в том, что свойства в классе Tags являются динамическими,Может быть только один тег, 2 или более, которые определяются только во время выполнения.

Я пытаюсь использовать Newtonsoft.Json для анализа этого во вложенном словаре, например Dictionary<string, <Dictionary<string, object[]>>>, где ключи словарейзначения тегов, а object[] содержит список значений (только значение, а не метка времени).

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Измените только свой тип данных tags в классе Series с

public Tags tags { get; set; }

На

public Dictionary<string, JToken> tags { get; set; }

И тогда вы сможете анализировать теги динамических ключей из вашего json.

Так что ваш класс Series будет.

public class Series
{
    public string name { get; set; }
    public Dictionary<string, JToken> tags { get; set; }
    public List<string> columns { get; set; }
    public List<List<object>> values { get; set; }
}
0 голосов
/ 11 декабря 2018

Возможно, вам следует использовать Словарь вместо класса тегов.

[JsonExtensionData]
public Dictionary<string,object> Tags{get;set;}

Например,

public class JsonSample
{
[JsonExtensionData]
public Dictionary<string,object> RandomKeyValuePair {get;set;}
}

// Sample Code
var jsonString = @"
{
'Key1' : 'some value 1',
'Key2' : 'some value 1',
'Key3' : 'some value 1',
'Key4' : 'some value 1',
}";



var jsonSampleObject = JsonConvert.DeserializeObject<JsonSample>(jsonString);

Обновление

Модифицированная серияКласс

public class Series
{
    public string name { get; set; }
    [JsonExtensionData]
    public IDictionary<string,JToken> tags { get; set; }
    public List<string> columns { get; set; }
    public List<List<object>> values { get; set; }
}

Вызов клиента

var result = JsonConvert.DeserializeObject<RootObject>(str);
Console.WriteLine(String.Join(",",result.results.First().series.First().tags.Select(x=>$"{x.Key}={x.Value},")));

Выход

tags={
  "tag1": "0",
  "tag2": "1"
},

Обратите внимание, что в вашем Json произошла ошибка."," отсутствует после "tag1": "0"

...