gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:34:50 25 4
gpt4 key购买 nike

有一个像这样的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com