C#使用通用对象操作JSON

时间:2017-08-24 23:03:58

标签: c# json

我有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项目中的数据可能不同?

2 个答案:

答案 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