gpt4 book ai didi

c# - 确定 JToken 是否为叶

转载 作者:行者123 更新时间:2023-11-30 15:23:26 28 4
gpt4 key购买 nike

我正在尝试动态查找结构事先未知的 JSON 对象的叶节点名称。首先,我将字符串解析为 JTokens 列表,如下所示:

        string req = @"{'creationRequestId':'A',
'value':{
'amount':1.0,
'currencyCode':'USD'
}
}";
var tokens = JToken.Parse(req);

然后我想确定哪些是树叶。在上面的例子中,'creationRequestId':'A', 'amount':1.0, 'currencyCode':'USD'是离开,名称为creationRequestIdamountcurrencyCode

尝试可行,但有点难看

下面的示例递归遍历 JSON 树并打印叶子名称:

    public static void PrintLeafNames(IEnumerable<JToken> tokens)
{
foreach (var token in tokens)
{
bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();
if (token.Type == JTokenType.Property && isLeaf)
{
Console.WriteLine(((JProperty)token).Name);
}

if (token.Children().Any())
PrintLeafNames(token.Children<JToken>());
}
}

这有效,打印:

creationRequestId
amount
currencyCode

但是,我想知道是否有一个不那么丑陋的表达式来确定 JToken 是否是一片叶子:

bool isLeaf = token.Children().Count() == 1 && !token.Children().First().Children().Any();

Incidentally, this is a one-liner in XML.

最佳答案

看起来您已将叶定义为任何 JProperty,其值没有任何子值。您可以使用 JToken 上的 HasValues 属性来帮助做出此决定:

public static void PrintLeafNames(IEnumerable<JToken> tokens)
{
foreach (var token in tokens)
{
if (token.Type == JTokenType.Property)
{
JProperty prop = (JProperty)token;
if (!prop.Value.HasValues)
Console.WriteLine(prop.Name);
}
if (token.HasValues)
PrintLeafNames(token.Children());
}
}

fiddle :https://dotnetfiddle.net/e216YS

关于c# - 确定 JToken 是否为叶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34457571/

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