我有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"
}
]
}
我说"大多数"因为除了以下内容之外,JSON可能会有所不同:
odata.metadata
个节点。value
节点,它将是一个数组。value
数组可以包含不同数量的项目,每个项目都有各种名称 - 值对,除了PartitionKey
之外。我需要做的是将JSON读入内存并去掉所有没有PartitionKey
=" 0000000001-0000000001"的价值物品。
到目前为止,我有以下代码:
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);
}
}
将value
转换为ArrayList似乎是我能够访问其数据的唯一方式,但是我无法访问PartitionKey
属性。
我怎样才能做我想要的事情 - 测试每个项目的价值并有条件地删除它们 - 以通用的方式,因为每个value
项目中的数据可能不同?
答案 0 :(得分:2)
我认为最简单的方法是使用Dictionary<string, string>
作为值属性。例如:
public class DataObject
{
[JsonProperty("odata.metadata")]
public string ODataMetadata { get; set; }
public IEnumerable<Dictionary<string, string>> Value { get; set; }
}
现在使用JSON.Net:
var data = JsonConvert.DeserializeObject<DataObject>(json);
然后过滤掉您不想要的值:
data.Value = data.Value
.Where(v => v.Any(kvp =>
kvp.Key == "PartitionKey" && kvp.Value == "0000000001-0000000001"));
答案 1 :(得分:1)
您可以使用JSON.NET的LINQ to JSON功能完成此操作:
var parsed = JObject.Parse(json);
var matchesPartitionKey = parsed["value"]
.Where(x => x["PartitionKey"].ToString() == "0000000001-0000000001")
.ToArray();
这将返回value
数组中具有匹配PartitionKey = 0000000001-0000000001
的所有项的数组。然后,您可以使用相同的语法获取这些项的详细信息:
Console.WriteLine(matchesPartitionKey.First()["Name"]);
// "General"
这是一个工作小提琴:https://dotnetfiddle.net/L3EB53