根据StackOverflow上的this回答:
Json.NET包含许多不属于JSON规范的功能。特别是,它允许解析一些正式和#34;无效。这包括不带引号的属性,注释,构造函数等。
这些是可从JToken
分配的所有类型:
JArray
JConstructor
JContainer
JObject
JProperty
JRaw
JValue
请告知以下情况是否属实:
{&#34}官方" JToken.Parse(json)
是不可能的。有效的json将在其后代中包含JConstructor
或JRaw
。
如果json是"官方"有效的,只能在以下类型中看到以下类型:JArray
,JObject
,JProperty
,JValue
。
答案 0 :(得分:4)
你的陈述是真的。
JConstructor
旨在启用JavaScript Date format中的日期捕获,例如:new Date(1234656000000)
。如Serializing Dates in JSON中所述:
从技术上讲,根据规范,这是无效 JSON,但所有浏览器和一些JSON框架(包括Json.NET)都支持它。
因此,在解析严格符合current IETF proposed standard或original JSON proposal的JSON时,JConstructor
不会出现。
JRaw
解析JSON时, JToken.Parse(string)
将从不出现。它主要用于帮助从JToken
层次结构中编写预格式化的JSON文字。通过使用JRaw
,可以避免解析已经格式化的JSON,只是为了发出它,例如:
var root = new JObject(new JProperty("response", new JRaw(jsonLiteral)));
var rootJson = root.ToString();
可以代替效率较低的代码来完成:
var root = new JObject(new JProperty("response", JToken.Parse(jsonLiteral)));
也可以反序列化为JRaw
以将JSON层次结构捕获为单个字符串文字,但我没有看到这样做有多大用处。例如,给定类:
public class RootObject
{
public JRaw response { get; set; }
}
可以这样做:
var rootDeserialized = JsonConvert.DeserializeObject<RootObject>(rootJson);
var jsonLiteralDeserialized = (string)rootDeserialized.response;
但是,这不一定比反序列化为JToken
更有效。
正如您所推测的那样,在解析严格有效的JSON时,只会出现JArray
,JObject
,JProperty
和JValue
。