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

时间:2019-01-21 19:32:57

标签: 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!

预期结果:

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

参考:

Querying JSON with SelectToken

2 个答案:

答案 0 :(得分:6)

首先,您的代码对换行符无效(如果您希望在不进行连接的情况下将换行符放在其中,请在其前面加上@并将引号替换为双引号,则您的字符串应为逐字字符串。

第二,您尝试在SelectTokens()上调用string ...您需要先将其解析为JObject

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

然后myJsonJObject(而不是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"]);