Json.NET中的JConstructor和JRaw
根据StackOverflow上的这个答案:
Json.NET包含许多不属于JSON规范的function。 特别是,它允许解析一些“正式”无效的JSON文件。 这包括不带引号的属性,注释,构造函数等。
这些是从JToken
分配的所有类型:
JArray JConstructor JContainer JObject JProperty JRaw JValue
请告诉我们以下是否属实:
-
“正式”有效的json上的
JToken.Parse(json)
在其后代中包含JConstructor
或JRaw
。 -
如果json是“正式”有效的,那么在这些后代中只能看到以下类型:
JArray
,JObject
,JProperty
,JValue
。
你的陈述是真的。
-
JConstructor
旨在以JavaScript日期格式捕获日期,例如:new Date(1234656000000)
。 如在JSON中序列化日期中所述 :从技术上讲,这是根据规范无效的 JSON,但所有浏览器和一些JSON框架,包括Json.NET,都支持它。
因此,在解析严格符合当前IETF建议标准或原始JSON提议的 JSON时,
JConstructor
不会出现。使用
JToken.Parse(string)
解析JSON时,JRaw
永远不会出现。 它主要用于促进从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
(rootJson); var jsonLiteralDeserialized = (string)rootDeserialized.response; 但是,这不一定比反序列
JToken
更有效。 -
正如您所推测的,在解析严格有效的JSON时,只会出现
JArray
,JObject
,JProperty
和JValue
。