当前位置: 首页 > 面试题库 >

Json.NET中的JConstructor和JRaw

蓬化
2023-03-14
问题内容

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

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

JArray
JConstructor
JContainer
JObject
JProperty
JRaw
JValue

请说明以下情况是否正确:

  1. JToken.Parse(json)在“官方”有效json的后代中,不可能包含JConstructorJRaw

  2. 假如一个JSON是“正式”有效的,谁也无法预料只有以下类型在这些后代看到:JArrayJObjectJPropertyJValue


问题答案:

您的陈述是正确的。

  1. JConstructor设计用于以JavaScript日期格式捕获日期,例如:new Date(1234656000000)。如JSON中的序列化日期所述:

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

因此,JConstructor在解析严格符合当前IETF提议的标准或原始JSON提议的
JSON时不会出现。

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

  1. 正如你猜想,只是JArrayJObjectJProperty并且JValue将解析严格有效的JSON时出现。


 类似资料:
  • 问题内容: 我自己构建了一个JObject,并希望将其作为ActionResult返回。我不想创建然后序列化数据对象 例如 问题答案: 您应该只可以在操作方法中执行此操作:

  • 这是一个.NET框架使用的 JSON 解析和操作的类库。 示例代码: Product product = new Product();product.Name = "Apple";product.ExpiryDate = new DateTime(2008, 12, 28);product.Price = 3.99M;product.Sizes = new string[] { "Small", 

  • 经过一番争论之后,我终于让我的Json结果在我的web api中为具有关联的类正常工作了: 但是当我在浏览器中或小提琴手中进行测试时,而不是像下面这样典型的东西: (一) (B)我明白了: "[{\"Id\":1,\ "姓名\":\"Book1\ ",\ "作者\":[{\"Id\":1,\"PersonId\":1,\"Person\":null,\"Books\":[{\"Id\":3,\ "

  • 问题内容: 我有一些必须序列化为JSON的数据。我正在使用JSON.NET。我的代码结构与此类似: 问题是,我的JSON输出需要具有ON OR 或ON- 取决于所使用的字段(即不为null)。默认情况下,我的JSON如下所示: 我知道我可以使用,但这给了我如下所示的JSON: 我需要的是: 有没有简单的方法可以做到这一点? 问题答案: 是的,您需要使用。 但是由于结构是值类型,因此您需要将Fiel

  • 问题内容: Json.NET(4.5.11)的最新版本包含StringEscapeHandling.EscapeNonAscii,可转义所有非ASCII字符。但是,我不知道在哪里将其作为参数传递。 如果我尝试: 然后我得到编译错误: 问题答案: 根据文档,此属性仅在JsonWriter及其继承者上可用。

  • 问题内容: 我从提供者那里得到了以下简化的JSON字符串,自从我使用Visual Studio和vb.Net以来已经有很长时间了,所以我很生锈! 我想使用JSON.Net将其转换为我可以使用的东西,我已经阅读了示例等,并且JSON.net看起来像答案,但我无处可去。 我的.Net代码(Me.TextBox1.Text包含上面显示的JSON) 有人可以解释一下为什么obj.ID总是以0结尾,为什么我