使用LINQ在JSON中子对象数组中搜索值

本文关键字:数组 搜索 对象 JSON 使用 LINQ | 更新日期: 2023-09-27 18:27:42

这是我的JSON:

[
  {
    "Assignees": [
      {
        "ID": "1111",
        "IsPrimaryOffice": true
      },
      {
        "ID": "2222",
        "IsPrimaryOffice": false
      }
    ],
    "Height": "76",
    "Width": "78",
    "Top": "160",
    "Left": "99.5"
  },
  {
    "Assignees": [
      {
        "ID": "3333",
        "IsPrimaryOffice": true
      },
      {
        "ID": "4444",
        "IsPrimaryOffice": false
      }
    ],
    "Height": "11",
    "Width": "11",
    "Top": "11",
    "Left": "11"
  },
  {
    "Assignees": null,
    "Height": "22",
    "Width": "22",
    "Top": "22",
    "Left": "22"
  },
]

其中,我的数组中的每个主对象都包含一个子对象数组"Assignees"。

因此,我要做的是在数组中的每个"Assignees"对象中搜索ID上的匹配项。

例如:我想找到Assignee对象,该对象的ID为"33333",并且对于带有LINQ的IsPrimaryOffice,其值也为true。我该怎么做?这是我想到的,但它总是返回null:

mainObject.Where(x => 
                 x.Assignees != null &&
                 x.Assignees.Any(y => y.ID == "3333" && y.IsPrimaryOffice == true))
          .FirstOrDefault();

有人能帮我吗?提前感谢

使用LINQ在JSON中子对象数组中搜索值

我已经使用json2sharp为提供的json:创建了类

var jsonArray = "[{'"Assignees'":[{'"ID'": '"1111'",'"IsPrimaryOffice'": true      },
  {'"ID'": '"2222'",'"IsPrimaryOffice'": false      }    ],
'"Height'": '"76'",    '"Width'": '"78'",    '"Top'": '"160'",    '"Left'": '"99.5'"  },  
{    '"Assignees'": [      {'"ID'": '"3333'",'"IsPrimaryOffice'": true      },     
{'"ID'": '"4444'",'"IsPrimaryOffice'": false      }    ],
'"Height'": '"11'",    '"Width'": '"11'",    '"Top'": '"11'",    '"Left'": '"11'"  }]";

生成为:

public class Assignee
{
    public string ID { get; set; }
    public bool IsPrimaryOffice { get; set; }
}
public class RootObject
{
    public List<Assignee> Assignees { get; set; }
    public string Height { get; set; }
    public string Width { get; set; }
    public string Top { get; set; }
    public string Left { get; set; }
}

现在,当我运行以下查询时

var rootObj = JsonConvert.DeserializeObject<JArray>(jsonArray).ToObject<List<RootObject>>().Where(x => 
                 x.Assignees != null &&
                 x.Assignees.Any(y => y.ID == "3333" && y.IsPrimaryOffice == true))
          .FirstOrDefault();
foreach (var assignee in rootObj.Assignees)
{
        Console.WriteLine("ID = " + assignee.ID);
            Console.WriteLine("IsPrimaryOffice = " + assignee.IsPrimaryOffice);
}

然后得到的输出

ID=3333
IsPrimaryOffice=真
ID=4444
IsPrimaryOffice=错误