JSON.NET 中的 Linq

Mid*_*hew 0 c# linq json json.net

我有一个 json 字符串,如下所示

{
    'Sheet1': [{
        'EmployeeNo': '123456',
        'EmployeeName': 'Midhun Mathew'
    }, {
        'EmployeeNo': '123457',
        'EmployeeName': 'Bill Gates'
    }, {
        'EmployeeNo': '123456',
        'Address': 'AAAA'
    }, {
        'EmployeeNo': '123457',
        'Address': 'BBBB'
    }]
}
JObject parsedJson = JObject.Parse(jsonString);

// Get the EmployeeNo's 

List<JToken> tokenList = parsedJson["Sheet1"]
                           .GroupBy(d => d["EmployeeNo"])
                           .Select(s => s.Key)
                           .ToList();

// Get the tokens which have the Same 'EmployeeNo'

foreach (JToken j in tokenList)
{
    IEnumerable<JToken> t = parsedJson["Sheet1"].Where(s => s["EmployeeNo"] == j);
}
Run Code Online (Sandbox Code Playgroud)

但在 foreach 中我只得到第一个

{
  "EmployeeNo": "123456",
  "EmployeeName": "Midhun Mathew"
}
Run Code Online (Sandbox Code Playgroud)

我不明白我在这里做错了什么。

我的初衷是将具有相同 EmployeeNo 的 JToken 分组为一个 JObject

所以在上面的例子中我会得到 2 个 JObject,因为有 2 个不同的 EmployeeNo

希望我清楚

Cha*_*ger 5

目前尚不完全清楚您在这里要做什么,但您似乎正在按 分组EmployeeNo,然后丢弃结果以仅获取键,然后尝试以更手动的方式再次进行分组。

如果删除该Select(s => s.Key)部分,则可以直接使用分组:

var tokensByEmployeeNo = parsedJson["Sheet1"].GroupBy(x => x["EmployeeNo"]);

foreach (var grouping in tokensByEmployeeNo)
{
    Console.WriteLine($"Key: {grouping.Key}");

    foreach (var token in grouping)
    {
        Console.WriteLine(token);
    }            
}
Run Code Online (Sandbox Code Playgroud)

如果您想JObject为每个分组创建一个“新”,那么您可能需要为JArray每个组创建一个:

var groupedArrays = parsedJson["Sheet1"]
    .GroupBy(x => x["EmployeeNo"])
    .Select(groupedRecords => new JArray(groupedRecords));
Run Code Online (Sandbox Code Playgroud)

其中第一个看起来像这样,例如:

[
  {
    "EmployeeNo": "123456",
    "EmployeeName": "Midhun Mathew"
  },
  {
    "EmployeeNo": "123456",
    "Address": "AAAA"
  }
]
Run Code Online (Sandbox Code Playgroud)