2017-02-01 29 views
1

采取以下有效的JSON:Newtonsoft 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

AFAIK不是一个错误,只是在使用空格访问键时,括号表示法是强制性的。目前找不到任何支持文档,因此仅作评论。 – Equalsk

+0

那么,任何json验证器都会高兴地验证jsons中的键,包括Newtonsoft的json.net,它们用方括号包装它们。我的问题是缺少点'。'在键之间。 – pts4

回答

2

这是不是一个错误。由JToken.Path返回的路径旨在位于JSONPath syntax。正如在original JSONPath proposal解释:

JSONPath表达式可以使用 -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)

+0

非常感谢您的帮助。 – pts4

相关问题