使用Json.NET在JSON上获取多个值

Igo*_*gor 0 c# json json.net

是否有一个函数可以在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)

参考:

使用SelectToken查询JSON

Jcl*_*Jcl 6

首先,你的代码是无效的与换行符(你的字符串应该是原义字符串,如果你想要把换行符它没有串联,与@在它前面,并用双引号替换引号).

其次,您要调用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,解析属性并返回结果对象的字符串,这似乎是您要求的,但我会留下作为练习)