【问题标题】:Is a primitive type considered JSON?原始类型是否被视为 JSON?
【发布时间】:2017-01-19 02:26:39
【问题描述】:

大多数情况下 JSON 的格式类似于

{
    color: "red",
    value: "#f00"
}

或者

[  
    { color: "red",     value: "#f00"   },
    { color: "red",     value: "#f00"   }
]

我想问的是原始类型,比如string、bool、int还有JSON吗?

我找到了跟随链接,

http://json-schema.org/latest/json-schema-core.html

http://www.json.org/

https://zh.wikipedia.org/wiki/JSON

https://www.ietf.org/rfc/rfc4627.txt

http://www.c-sharpcorner.com/uploadfile/3d39b4/data-types-in-json/

还有,

在 RFC4627 中它说

JSON 可以表示四种基本类型(字符串、数字、布尔值、 和 null)和两种结构化类型(对象和数组)。

字符串是零个或多个 Unicode 字符 [UNICODE] 的序列。

对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串、数字、 布尔值、空值、对象或数组。

数组是零个或多个值的有序序列。

术语“对象”和“数组”来自于 JavaScript。

所以我把它读成纯字符串,布尔数字

"a string"

100

true

都是JSON,

但是我的两个同事认为原始类型只能是对象中的值,

{ ASTRING : "astring" } 是 JSON,

如果只有"a string",则不调用,因为它不是JSON格式,

我觉得我和我的同事可能不够专业,无法判断,

所以我想知道,JSON是纯原始类型吗?

.

我的另一个想法是,JSON被称为交换数据的便捷方式,但如果这种格式不支持纯字符串,

也就是说,如果我只是想抛出一个字符串,我不能用JSON来做吗?

并且必须强制将其更改为{ Message : "a message"}

并且不能使用我认为更简单的方式只是抛出"a message" ...?

【问题讨论】:

  • 是的,正如规范所说,JSON 可以是顶级原始值,无需对象包装。
  • RFC4627 是信息性的。它已被RFC7159 淘汰。

标签: json


【解决方案1】:

相关的 RFC 是 RFC 7159,而不是 RFC 4627。RFC 4627 是“信息性的”。 RFC 7159 是“标准轨道”;它explicitly obsoletes RFC 4627

征求意见:7159 Google, Inc. 已淘汰:4627、7158 2014 年 3 月 类别:标准轨道 ISSN: 2070-1721

在 RFC 7159 的文本中,您会发现这一点。

13. 例子 这是一个 JSON 对象: { “图片”: { “宽度”:800, “身高”:600, “标题”:“从 15 楼观看”, “缩略图”:{ "网址": "http://www.example.com/image/481989943", “身高”:125, “宽度”:100 }, “动画”:假, “ID”:[116、943、234、38793] } } [剪辑] 以下是三个仅包含值的小型 JSON 文本: “你好世界!” 42 真的

【讨论】:

  • 我很惊讶 Google 应该拥有 JSON。
【解决方案2】:

{ "astring" } 不是有效的 JSON,"astring"astring 也不是,因为我们需要一个键和一个值,例如{ KEY : VALUE } 其中KEY 始终是字符串,VALUE 可以是字符串、数字、布尔值或空值。

来自规范:

是的,正如规范所说,JSON 可以是顶级原始值,无需 包裹它的物体。 ——安迪·雷

如果我理解正确,那么该评论是不正确的。有效的 JSON 从不本身就是顶级原始值。如果您仍然感到困惑,这应该可以解决问题:

  1. JSON 语法

    JSON 文本是一个标记序列。令牌集包括 六个结构字符、字符串、数字和三个文字 名字。

    JSON 文本是一个序列化的对象或数组。

    JSON-text = object / array

    这些是六个结构字符:

    begin-array = ws %x5B ws ; [ left square bracket

    begin-object = ws %x7B ws ; { left curly bracket

    end-array = ws %x5D ws ; ] right square bracket

    end-object = ws %x7D ws ; } right curly bracket

    name-separator = ws %x3A ws ; : colon

    value-separator = ws %x2C ws ; , comma

    在这六个中的任何一个之前或之后都允许有无关紧要的空格 结构特征。

【讨论】:

  • 但是“astring”——正如我所问的 yu yang Jian 吗?如果上面 RFC4627 中的引用是正确且完整的,那么在我看来是“是”。
  • @Roadowl:根据 RFC4627(2, JSON Grammar),“JSON 文本是一个序列化的对象或数组。”上面的 OP 引用摘自引言,它粗略地介绍了您可以使用 JSON 做什么,而不是它的正式属性。
  • 您只提供了“对象”的定义,而 OP 似乎想知道数字、字符串、布尔值在 JSON 规范下是否有效,即“是”,它们是 JSON 价值观。 JSON.parse(2) 是 Javascript,返回 2。字符串和 true/false 相同
  • 只是一个小更新。实际上还有另一个 JSON 规范 (tools.ietf.org/html/rfc7159) 允许在 JSON 文本中使用纯文字。所以,是的,混乱。
  • @DavidTitarenco:这不仅仅是另一个 JSON 规范。这是一个标准跟踪 RFC,明确废弃了信息性 RFC 4627。
【解决方案3】:

FWIW,这是命令行 JSON 解析器 prgram jq 的输出:

$ echo "{ foo }" | jq .
parse error: Invalid literal at line 1, column 6

$ echo "{ \"foo\" }" | jq .
parse error: Objects must consist of key:value pairs at line 1, column 9

$ echo "\"foo\"" | jq .
"foo"

目前我无法访问其他解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多