Json.NET中的JConstructor和JRaw

根据StackOverflow上的这个答案:

Json.NET包含许多不属于JSON规范的function。 特别是,它允许解析一些“正式”无效的JSON文件。 这包括不带引号的属性,注释,构造函数等。

这些是从JToken分配的所有类型:

 JArray JConstructor JContainer JObject JProperty JRaw JValue 

请告诉我们以下是否属实:

  1. “正式”有效的json上的JToken.Parse(json)在其后代中包含JConstructorJRaw

  2. 如果json是“正式”有效的,那么在这些后代中只能看到以下类型: JArrayJObjectJPropertyJValue

你的陈述是真的。

  1. 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更有效。

  2. 正如您所推测的,在解析严格有效的JSON时,只会出现JArrayJObjectJPropertyJValue