C#使用泛型对象操作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

我使用的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":"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
    节点
  • 根目录下始终会有一个
    节点,它将是一个数组
  • 数组可以有不同数量的项,每个项都有不同的名称-值对,除了一个总是
    分区键
我需要做的是将JSON读入内存并去掉所有没有分区键的值项

到目前为止,我有以下代码:

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"