c# - JSON.NET。从其子项导航到 JArray 对象

标签 c# json json.net

有一个像这样的 JSON 文件:

{
  "men": [
    {
      "name": "Jordan",
      "phone": "333-333-33"
    },
    {
      "name": "Timothey",
      "phone": "444-444-44"
    }
  ],
  "women": [
    {
      "name": "Jordan",
      "phone": "111-111-11"
    },
    {
      "name": "Sasha",
      "phone": "222-222-22"
    }
  ]
}

我想找到所有名字以 J 开头的人,并确定这个人是男是女。

var jsonProps = jsonDoc.Descendants().Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == prop);
var startsWithJ = jsonProps.Where(t => ((JProperty)t).Value.ToString().StartsWith("J"));

foreach (var person in startsWithJ)
{
    Console.WriteLine(person.Value<string>());
    Console.WriteLine(person.Parent.Parent.Value<string>());
}

问题是 person.Parent.Parent 为空,我希望它不是 JArray 或至少是 JToken 或至少是一些 JToken,这样我就可以获得它的值。

更新: 我有 100 种使用相似数据结构的类型。这些集合(男性、女性)可以位于任何嵌套级别,例如employee包含男女集合,或者student包含男女集合。我无法为解决方案中的每种类型创建强类型对象。有时我需要从 men/women 集合中移除对象,然后检查集合是否有任何元素。

最佳答案

这不是对“如何使用 LINQ to Json 进行查询”的直接回答,而是我发现使用强类型对象更容易的一种方法。

通过简单地创建以下数据结构(注意 POCO 装饰有 JsonProperty,这是一个 Json.NET 属性):

public class RootObject
{
    public List<Person> Men { get; set; }
    public List<Person> Women { get; set; }
}

public class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("phone")]
    public string PhoneNumber { get; set; }

    public Sex Sex { get; set }
}

public enum Sex
{
    Man,
    Women
}

现在,您可以使用 LINQ to Objects 相当轻松地查询您需要的内容:

var rootObject = JsonConvert.DeserializeObject<RootObject>(json);

foreach (var male in rootObject.Men)
{
    male.Sex = Sex.Man;
}

foreach (var female in rootObject.Women)
{
    female.Sex = Sex.Women;
}

var startsWithJ = rootObject.Men.Concat(rootObject.Women)
                            .Where(x => x.Name.StartsWith("J",
                                        StringComparison.OrdinalIgnoreCase))
                            .ToList();

foreach (var personStartsWithJ in startsWithJ)
{
    Console.WriteLine (personStartsWithJ.Name);
    Console.WriteLine (personStartsWithJ.Sex);
}

关于c# - JSON.NET。从其子项导航到 JArray 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28750002/

相关文章:

android - Retrofit 2.0 如何在不转换的情况下获取 JSON 对象?

json.net - 如何检查对象是 JProperty 还是 JArray

c# - 从 JsonConverter 运行默认序列化逻辑

C# 正则表达式匹配一行只有空格

c# - 获取带有属性的 XmlNode 打开标记

c# - 如何在另一个类中的类中添加数据

c# - ASP.NET MVC 文件路径结果 : How to return an html file not found?

python - 从 python dataframe 列中删除非 json 对象行

java - 使用 POST 注册用户 - 如何正确使用 ResponseEntity?

c# - 如何根据键是否存在从对象列表中获取对象列表?