是否有一个函数可以在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""
}");
那么myJson
是JObject
(而不是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"]);