我有一个有效的JSON对象,它包含多个"en-US"键,我正在尝试选择它。为此,我使用JsonPath
"$..en-US"
它提供给Json.NET实现的SelectTokens过程。它是.NET的Json框架。只要我的Json不包含任何空数组,一切都很好。这里有一个例子:
var myJsonPath = "$..en-US";
var myJson =
@"{
'controls': [
{
'messages': {
'addSuggestion': {
'en-US': 'Add'
}
}
},
{
'header': {
'controls': []
},
'controls': [
{
'controls': [
{
'defaultCaption': {
'en-US': 'Sort by'
},
'sortOptions': [
{
'label': {
'en-US': 'Name'
}
}
]
}
]
}
]
}
]
}";
var jToken = JObject.Parse(myJson);
var tokens = jToken.SelectTokens(myJsonPath);
这里,标记变量将只包含一个元素!这将是"en-US"出现在"header"对象的"controls"中的空数组之前。然而,当我把这个"头"对象去掉时:
var myJson =
@"{
'controls': [
{
'messages': {
'addSuggestion': {
'en-US': 'Add'
}
}
},
{
'controls': [
{
'controls': [
{
'defaultCaption': {
'en-US': 'Sort by'
},
'sortOptions': [
{
'label': {
'en-US': 'Name'
}
}
]
}
]
}
]
}
]
}";
我会按预期得到"en-US"的所有3次出现。顺便说一句,如果我在在线工具中的第一个JSON对象(即,它包含一个空数组)上验证我的JsonPath,那么正如预期的那样,我会得到所有三种"en-US"情况。这与我从Json.NET中得到的不同。我想知道这是一个错误,还是我必须手动处理这种情况?
这是一个已经修复的错误。升级至Json.NET的最新版本。
如果你和我一样,在更新Json.NET版本方面有点困难,你可以通过以下方式来解决这个问题:
IEnumerable<JValue> vals = jToken
.Desecendants()
.Where(w => w is JProperty && w.Name=="en-US")
.Select(s => s.Value);
希望能有所帮助!vals数组将包含与您之前尝试使用的选择器相同的令牌。