如何在ASP.NET Core中使用动态键反序列化复杂的JSON?

时间:2018-12-11 04:52:37

标签: c# json asp.net-core-2.1 .net-core-2.1

我有一个看起来像这样的复杂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类中的属性是动态的。只能有一个标记,两个或多个只能在运行时确定。

我正在尝试使用Newtonsoft.Json将其解析为诸如Dictionary<string, <Dictionary<string, object[]>>>之类的嵌套字典,其中字典的键是标签的值,而object[]包含值的列表(只是值,而不是时间戳。

2 个答案:

答案 0 :(得分:2)

您应该使用Dictionary而不是Tag Class。

[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”

答案 1 :(得分:0)

仅从

更改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; }
}