jtoken判断是否包含键_c#-确定JToken是否为叶子

该博客介绍了如何在C#中动态查找JSON对象的叶节点名称。通过使用JToken.Parse解析JSON字符串,然后递归遍历JSON树,确定哪些JToken是叶子节点。文章提供了一个方法PrintLeafNames,用于打印叶节点的名称,并展示了如何优化判断JToken是否为叶子节点的表达式,利用JToken的HasValues属性进行判断。
摘要由CSDN通过智能技术生成

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

string req = @"{'creationRequestId':'A',

'value':{

'amount':1.0,

'currencyCode':'USD'

}

}";

var tokens = JToken.Parse(req);

然后,我想确定哪些是叶子.在上面的示例中,“ creationRequestId”:“ A”,“ amount”:1.0和“ currencyCode”:“ USD”是叶子,名称是creationRequestId,金额和currencyCode.

尝试有效,但略显丑陋

下面的示例以递归方式遍历JSON树并显示叶子名称:

public static void PrintLeafNames(IEnumerable 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());

}

}

这可行,打印:

creationRequestId

amount

currencyCode

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

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

解决方法:

似乎您已将叶子定义为任何JProperty,其值没有任何子值.您可以使用JToken上的HasValues属性来帮助确定:

public static void PrintLeafNames(IEnumerable 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());

}

}

标签:json-net,json,c

来源: https://codeday.me/bug/20191027/1945301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值