Json.NET中的JConstructor和JRaw

时间:2016-04-30 18:32:49

标签: c# json types json.net

根据StackOverflow上的this回答:

  

Json.NET包含许多不属于JSON规范的功能。特别是,它允许解析一些正式和#34;无效。这包括不带引号的属性,注释,构造函数等。

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

JArray
JConstructor
JContainer
JObject
JProperty
JRaw
JValue

请告知以下情况是否属实:

  1. {&#34}官方" JToken.Parse(json)是不可能的。有效的json将在其后代中包含JConstructorJRaw

  2. 如果json是"官方"有效的,只能在以下类型中看到以下类型:JArrayJObjectJPropertyJValue

1 个答案:

答案 0 :(得分:4)

你的陈述是真的。

  1. JConstructor旨在启用JavaScript Date format中的日期捕获,例如:new Date(1234656000000)。如Serializing Dates in JSON中所述:

      

    从技术上讲,根据规范,这是无效 JSON,但所有浏览器和一些JSON框架(包括Json.NET)都支持它。

    因此,在解析严格符合current IETF proposed standardoriginal 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更有效。

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