Newtonsoft JSON.NET和json密钥中的空格错误?

时间:2017-02-01 17:23:15

标签: c# json json.net

采取以下有效的json:

{
   "universe": {
      "solar system": "sun"
   }
}

这里是简单的C#代码:

using Newtonsoft.Json;
JToken x = JToken.Parse("{\"universe\": {\"solar system\": \"sun\"}}");
string s = x.First.First.First.Path;

此时s = "universe['solar system']"

但是我期待"universe.['solar system']"(注意'。'"宇宙")。

如果json键没有空格(" solar_system"),我得到"universe.solar_system"这是正确的。

问题是:这是json.net中的错误还是我需要做其他事情来支持json密钥中的空格?

谢谢,

PT

1 个答案:

答案 0 :(得分:3)

这不是错误。 JToken.Path返回的路径位于JSONPath syntax。正如original JSONPath proposal

中所述
  

JSONPath表达式可以使用 dot -notation

     

$.store.book[0].title

     

括号 -notation

     

$['store']['book'][0]['title']

因此universe['solar system']完全有效,如果您将其传递给SelectToken(),您将获得正确的值"sun"

JToken x = JToken.Parse("{\"universe\": {\"solar system\": \"sun\"}}");
string path = x.First.First.First.Path;

Console.WriteLine(path);    // Prints universe['solar system']
var val = (string)x.SelectToken(path);
Console.WriteLine(val);     // Prints "sun"
Debug.Assert(val == "sun"); // No assert

另见Querying JSON with SelectToken and escaped properties

如果您仍希望路径中有额外的.,则可以根据reference source创建自己的扩展方法JTokenExtensions.ExpandedPath(this JToken token)