使用JSON.NET获取JSON上的多个值



是否有一个函数可以在JSON字符串上选择多个"节点"?

样品:

var myJson = @"{
'channel' :  'nine',
'segment' :  'mobile',
'food' :  'pizza'
}";
var myObjectFromJson = JObject.Parse(myJson);
var channelFoodNodes = myObjectFromJson.SelectTokens("channel, food"); //<- This call not works!

预期结果:

{
"channel" :  "nine",
"food" :  "pizza"
}

参考:

使用SelectToken 查询JSON

首先,您的代码与换行符一起无效(如果您想将换行符放在其中而不进行串联,则您的字符串应该是一个逐字逐句的字符串,前面有@,引号用双引号替换)。

其次,您正在尝试在string上调用SelectTokens()。。。您需要首先将其解析为JObject

var myJson = JObject.Parse(@"
{
""channel"" :  ""nine"",
""segment"" :  ""mobile"",
""food"" :  ""pizza""
}");

那么myJsonJObject(而不是string),您可以在上调用SelectTokens()

然而,您想要实现的目标无法通过JPath(SelectTokens()使用的是JPath)实现,因此您最好直接解析对象,比如:

var channelFoodNodes = myJson.Children()
.OfType<JProperty>()
.Where(x => new []{ "channel", "food"}.Contains(x.Name));     

然后,您可以从JProperties:的可枚举结果中构造一个新的JObject

var newObject = new JObject(channelFoodNodes);

它将包含您生成的对象。

你可以在这个小提琴中看到所有的动作


如果你想用这种方式选择属性(就像你试图用SelectTokens()做的那样),你也可以构建一个简单的扩展方法:

public static IEnumerable<JProperty> SelectRootProperties(this JObject obj, params string[] propertyNames)
{
return obj.Children().OfType<JProperty>().Where(x => propertyNames.Contains(x.Name));       
}

并称之为:

myObject.SelectRootProperties("channel", "food");

在这个其他小提琴中看到它的动作

(或者,您也可以制作一个简单的方法,获取输入json字符串和属性名称,构造JObject,解析属性并返回结果对象的字符串,这似乎是您所要求的,但我将把它作为练习)

您现有的数据是字符串的键/值。您可以将其反序列化为Dictionary<string, string>,并从生成的字典中访问所需的片段。

var things = JsonConvert.DeserializeObject<Dictionary<string,string>>(json);
Console.WriteLine(things["channel"]);
Console.WriteLine(things["food"]);

相关内容

  • 没有找到相关文章

最新更新