C#使用泛型对象操作JSON
我使用的JSON主要如下所示:C#使用泛型对象操作JSON,c#,json,C#,Json,我使用的JSON主要如下所示: { "odata.metadata":"XXX", "value":[ { "PartitionKey":"0000000001-0000000001", "RowKey":"8a6f7335-4cc7-4aaa-9b48-f719a1f56844", "Timestamp":"2016-11-07T18:19:59.3147580Z", "DistributionNu
{
"odata.metadata":"XXX",
"value":[
{
"PartitionKey":"0000000001-0000000001",
"RowKey":"8a6f7335-4cc7-4aaa-9b48-f719a1f56844",
"Timestamp":"2016-11-07T18:19:59.3147580Z",
"DistributionNumber":1,
"Name":"General"
},
{
"PartitionKey":"0000000001-0000000001",
"Id":"bce10165-3a3e-4166-9907-2ed02c0f83fb",
"Timestamp":"2016-11-07T18:20:17.1260274Z",
"DistributionNumber":1,
"Designation":"Secondary"
}
]
}
我之所以说“大部分”,是因为JSON可能会有所不同,但以下情况除外:
{
"odata.metadata":"XXX",
"value":[
{
"PartitionKey":"0000000001-0000000001",
"RowKey":"8a6f7335-4cc7-4aaa-9b48-f719a1f56844",
"Timestamp":"2016-11-07T18:19:59.3147580Z",
"DistributionNumber":1,
"Name":"General"
},
{
"PartitionKey":"0000000001-0000000001",
"Id":"bce10165-3a3e-4166-9907-2ed02c0f83fb",
"Timestamp":"2016-11-07T18:20:17.1260274Z",
"DistributionNumber":1,
"Designation":"Secondary"
}
]
}
- 根目录下始终会有一个
节点odata.metadata
- 根目录下始终会有一个
节点,它将是一个数组值
数组可以有不同数量的项,每个项都有不同的名称-值对,除了一个总是值
分区键
var jsonObj = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(jsonString);
var value = (ArrayList)jsonObj["value"];
foreach (var item in value)
{
if (item["PartitionKey"] != "0000000001-0000000001")
{
value.Remove(item.Key);
}
}
var jsonObj=new JavaScriptSerializer()。反序列化(jsonString);
var value=(ArrayList)jsonObj[“value”];
foreach(价值中的var项目)
{
如果(项目[“分区键”]!=“000000000 1-000000000 1”)
{
值。删除(项。键);
}
}
将值
转换为ArrayList似乎是我访问其数据的唯一方法,但是访问分区键
属性时遇到问题
由于每个
值
项中的数据可能不同,我如何做我想做的事情?在值中测试每个项并有条件地删除它们?我认为最简单的方法是对值属性使用字典。例如:
public class DataObject
{
[JsonProperty("odata.metadata")]
public string ODataMetadata { get; set; }
public IEnumerable<Dictionary<string, string>> Value { get; set; }
}
您可以通过JSON.NET的功能实现这一点:
这将返回值
数组中具有匹配PartitionKey=000000000 1-000000000 1
的所有项的数组。然后,您可以使用相同的语法获取这些项目的详细信息:
Console.WriteLine(matchesPartitionKey.First()["Name"]);
// "General"
这里有一个可行的办法:@itsme86已修复。我通常会使用反序列化对象
,但是,出于某种原因,我认为除非我序列化所有属性,否则这是行不通的。谢谢我刚刚注意到它看起来像是将int
属性转换为string
s,意思是现在的键值对,其中的值没有用引号括起来,现在是。鉴于属性名称不同,我能做些什么?您可以使用字典
(您还需要在比较中执行kvp.Value.ToString()
)来解决我刚才描述的问题吗?不确定您遇到了什么问题,但这意味着这些项目将被解码为int
或DateTime
,而不仅仅是string
var parsed = JObject.Parse(json);
var matchesPartitionKey = parsed["value"]
.Where(x => x["PartitionKey"].ToString() == "0000000001-0000000001")
.ToArray();
Console.WriteLine(matchesPartitionKey.First()["Name"]);
// "General"