我有一个看起来像这样的复杂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[]
包含值的列表(只是值,而不是时间戳。
答案 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; }
}