是否有一个函数可以在JSON字符串上选择多个"节点"?
样品:
var myJson = @"{
'channel' : 'nine',
'segment' : 'mobile',
'food' : 'pizza'
}";
var myObjectFromJson = JObject.Parse(myJson);
var channelFoodNodes = myObjectFromJson.SelectTokens("channel, food"); //<- This call not works!
Run Code Online (Sandbox Code Playgroud)
预期结果:
{
"channel" : "nine",
"food" : "pizza"
}
Run Code Online (Sandbox Code Playgroud)
参考:
首先,你的代码是无效的与换行符(你的字符串应该是原义字符串,如果你想要把换行符它没有串联,与@在它前面,并用双引号替换引号).
其次,您要调用SelectTokens()一个string......你需要将其解析到一个JObject第一:
var myJson = JObject.Parse(@"
{
""channel"" : ""nine"",
""segment"" : ""mobile"",
""food"" : ""pizza""
}");
Run Code Online (Sandbox Code Playgroud)
然后myJson是一个JObject(而不是一个string)你可以打电话SelectTokens()的地方
但是,使用JPath(这是什么SelectTokens()用途)无法实现您想要实现的目标,因此您最好直接解析对象,例如:
var channelFoodNodes = myJson.Children()
.OfType<JProperty>()
.Where(x => new []{ "channel", "food"}.Contains(x.Name));
Run Code Online (Sandbox Code Playgroud)
然后你可以JObject从结果的可枚举构造一个新的JProperties:
var newObject = new JObject(channelFoodNodes);
Run Code Online (Sandbox Code Playgroud)
哪个将包含您生成的对象.
你可以在这个小提琴中看到它的全部动作
如果你想以这种方式选择属性(正如你试图做的那样SelectTokens()),你也可以构建一个简单的扩展方法:
public static IEnumerable<JProperty> SelectRootProperties(this JObject obj, params string[] propertyNames)
{
return obj.Children().OfType<JProperty>().Where(x => propertyNames.Contains(x.Name));
}
Run Code Online (Sandbox Code Playgroud)
称之为:
myObject.SelectRootProperties("channel", "food");
Run Code Online (Sandbox Code Playgroud)
在另一个小提琴中看到它的实际效果
(或者您也可以创建一个简单的方法来获取输入json字符串和属性名称,构造JObject,解析属性并返回结果对象的字符串,这似乎是您要求的,但我会留下作为练习)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |