C# Json.NET中的JConstructor和JRaw

C# Json.NET中的JConstructor和JRaw,c#,json,types,json.net,C#,Json,Types,Json.net,根据对StackOverflow的回答: Json.NET包含许多不属于Json规范的功能。特别是,它允许解析一些“正式”无效的JSON文件。这包括未引用的属性、注释、构造函数等 这些是可从JToken分配的所有类型: JArray JConstructor JContainer JObject JProperty JRaw JValue 请说明以下情况是否属实: “正式”有效json上的JToken.Parse(json)不可能在其子代中包含JConstructor或JRaw 如果json是

根据对StackOverflow的回答:

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

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

JArray
JConstructor
JContainer
JObject
JProperty
JRaw
JValue
请说明以下情况是否属实:

  • “正式”有效json上的
    JToken.Parse(json)
    不可能在其子代中包含
    JConstructor
    JRaw

  • 如果json是“正式”有效的,那么在这些子体中只能看到以下类型:
    JArray
    JObject
    JProperty
    JValue


  • 你的陈述是正确的

  • 设计用于在中捕获日期,例如:
    新日期(1234656000000)
    。如中所述:

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

    因此,当解析严格符合或的JSON时,
    JConstructor
    将不会出现

    使用解析JSON时将永远不会出现。它主要用于促进从
    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;
    
    var rootDeserialized=JsonConvert.DeserializeObject(rootJson);
    var jsonLiteralDeserialized=(字符串)rootDeserialized.response;
    
    然而,这并不一定比反序列化到
    JToken
    更有效

  • 正如您推测的,在解析严格有效的JSON时,只有
    JArray
    JObject
    JProperty
    JValue
    会出现