有没有可以在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"
}
参考:
答案 0 :(得分:6)
首先,您的代码对换行符无效(如果您希望在不进行连接的情况下将换行符放在其中,请在其前面加上@并将引号替换为双引号,则您的字符串应为逐字字符串。
第二,您尝试在SelectTokens()
上调用string
...您需要先将其解析为JObject
:
var myJson = JObject.Parse(@"
{
""channel"" : ""nine"",
""segment"" : ""mobile"",
""food"" : ""pizza""
}");
然后myJson
是JObject
(而不是string
),您可以在其中致电SelectTokens()
但是,要使用JPath无法实现(SelectTokens()
使用的方法),因此最好还是直接解析对象,例如:
var channelFoodNodes = myJson.Children()
.OfType<JProperty>()
.Where(x => new []{ "channel", "food"}.Contains(x.Name));
然后,您可以根据所得的JObject
枚举构造一个新的JProperties
:
var newObject = new JObject(channelFoodNodes);
将包含您生成的对象。
您可以在运行中in this fiddle
查看全部内容如果您要以这种方式选择属性(就像您尝试使用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");
查看实际情况in this other fiddle
(或者您也可以创建一个简单的方法来获取输入的json字符串和属性名称,构造JObject
,解析属性并返回结果对象的字符串,这似乎就是您所需要的问,但我将其保留为练习)
答案 1 :(得分:1)
您现有的数据是字符串的键/值。您可以将其反序列化为Dictionary<string, string>
,然后从生成的字典中访问所需的片段。
var things = JsonConvert.DeserializeObject<Dictionary<string,string>>(json);
Console.WriteLine(things["channel"]);
Console.WriteLine(things["food"]);