【问题标题】:Is a plain string valid JSON? [duplicate]纯字符串是有效的 JSON 吗? [复制]
【发布时间】:2014-06-12 12:21:40
【问题描述】:

纯字符串是有效的 JSON 还是必须有一个对象?

例如:

"morpheus"

对比:

{
    "name": "morpheus"
}

【问题讨论】:

  • 是的。试试JSON.parse("\"hello world\"")JSON.parse(5)
  • 我想指出 ECMA standard document (几乎)开始定义 JSON value 是什么,包括字符串和数字文字以及 @ 987654329@、falsenull。当然,还有数组和对象。这就是 @CRAM 和 JSONLint 等正确的原因。
  • 另外,json.org 表示 JSON value 可能是 objectarraystringnumbertruefalse 或 @987654@3 .然后描述objectarray 是如何组成的。

标签: json


【解决方案1】:

在 Javascript 中有效。

一开始你可能会感到困惑:

JSON.parse("bob");

这将失败并出现错误:“意外的令牌 b”。但是,这相当于只传递简单的 bob 作为响应中的文本,而不是 "bob"。如果添加引号:

JSON.parse('"bob"')

你应该得到简单的字符串“bob”。

【讨论】:

    【解决方案2】:

    重要

    这个答案曾经说不,JSON的第一个字符必须是{[

    在我写这篇文章的时候,我正在用 Python 测试它。在 Python(至少 2.7.x)中,json.loads("a") 给出错误,这意味着纯字符串在此处不是有效的 JSON。

    其他人已经正确地指出,不能说纯字符串不是有效的 JSON。请参阅this question 以获得更合适的答案。

    此时我只能说这取决于您的环境。在 javascript 中它可能是有效的,在 python 中它可能不是,等等等等。

    JSON 代表 JavaScript 对象表示法

    这是来自the official site的引述

    JSON 建立在两种结构之上:

    名称/值对的集合。在各种语言中,这是 实现为对象、记录、结构、字典、哈希表、键控 列表或关联数组。值的有序列表。多数情况 语言,这被实现为数组、向量、列表或序列。 这些是通用数据结构。几乎所有现代编程 语言以一种或另一种形式支持它们。这是有道理的 可与编程语言互换的数据格式 基于这些结构。

    在 JSON 中,它们采用以下形式:

    对象是一组无序的名称/值对。一个对象开始 带有 {(左大括号)并以 }(右大括号)结尾。 每个名称都是 后跟 :(冒号),名称/值对由 , 分隔 (逗号)。

    注意我加粗的文字。

    正因为如此,并且 JSON 是 JS Object 表示法,这意味着名称:值对的 JSON 表示必须始终采用

    的形式
    {
      "name": "value"
    }
    

    请注意,您也可以将“根对象”设为列表

    [
      {
        "name1": "value1"
      },
      {
        "name2": "value2"
      }
    ]
    

    这基本上意味着 JSON 包含多个对象。


    正如 Sunny R Gupta 指出的,这也是有效的 JSON

    [
      "this",
      "is",
      "valid"
    ]
    

    请注意,这是有效的,因为字符串不是"name":"value" 的形式,而只是字符串。考虑到您的示例的有效选项将是

    {
      "name": "Morpheus"
    }
    

    [
      "morpheus"
    ]
    

    JSON 的第一个字符必须{[

    【讨论】:

    • 我不同意,该数组甚至可以是一个字符串数组,没有{} 并且仍然构成一个有效的 JSON。例如["This","is","valid"].
    • @SunnyRGupta 你这么说是对的,但如果你把它改成["a":"1", "b":"2"],那将是无效的,因为名称/值对必须在{} 中,这就是我的意思。我会编辑我的答案以包含您的示例
    • @SunnyRGupta 很公平,我会删除它以避免混淆
    • 这是错误的。该部分(尤其是粗体文本)仅描述了对象是什么。关于数组有一个类似的段落。它没有说对象是唯一允许的根值。再一次,它描述了一个可以是一个对象、一个数组,也可以是一个字符串、一个数字等。
    • 这条评论是错误的。 RFC 4627 (2006) 规定:“JSON 文本是一个序列化的对象或数组。” RFC 7159 (2014) 中取消了此限制:“JSON 文本是序列化值。”您在 Python 中的测试在新 RFC 中仍然无效,因为您应该输入 json.loads('"a"') 而不是 json.loads("a")(所有 JSON 文本都应包含在 Python 字符串对象中)。
    【解决方案3】:

    更新:2018 年

    我最初回答这个问题已经 4 年了。当时引号中的纯字符串不是有效的 JSON。截至今天,它已被接受为有效的 JSON。

    保留以下内容供人们查看以前的错误:


    解析一个简单的字符串给出:

    Parse error on line 1:
    "morpheus"
    ^
    Expecting '{', '['
    

    表示它需要是一个对象或数组。

    提示:要验证 JSON 字符串并查看哪些有效,哪些无效,请尝试使用 http://jsonlint.com

    【讨论】:

    • 实际上,当我现在尝试(在同一页面上)时,它显示“有效 JSON”。哪个是正确的。
    • 这个答案不再正确,jsonlint.com 现在接受 "morpheus" 作为 JSON。
    • 已更新,感谢您指出更改。
    猜你喜欢
    • 1970-01-01
    • 2013-02-13
    • 2012-10-30
    • 2022-01-26
    • 1970-01-01
    • 2021-04-12
    • 2018-05-13
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多