【问题标题】:JSON Object With or Without Quotes带或不带引号的 JSON 对象
【发布时间】:2013-09-09 05:13:01
【问题描述】:

我正在尝试学习 JSON,我了解到任何带有双引号键的 javascript 对象都被视为 JSON 对象。

我构造了这个对象

var jstr1 = {"mykey": "my value"};

但是当我尝试使用 JSON.parse(jstr1) 进行解析时,出现以下错误。看截图。

但是当我尝试解析这个时

var jstr = '{"mykey": "my value"}';,

我成功了,看截图。我对此感到困惑。请解释我为什么会发生这种情况。这两种形式有什么区别。

当我从任何服务收到 JSON 作为响应时,它会是什么样子,是jstr 还是jstr1 的形式

提前感谢您的帮助。

【问题讨论】:

  • 正如@ComFreek sais,如果您已经拥有Hash,您希望从解析中获得什么?
  • 第一个是对象。其次是一个字符串,准确地说是一个 JSON。 JSON.parse 适用于字符串,而不是对象。

标签: javascript json


【解决方案1】:

您正在创建一个 JavaScript Object。如果您想要其中的 JSON 字符串,请使用 JSON.stringify

所以

var myObj = {mykey: "my value"}
   ,myObjJSON = JSON.stringify(myObj);

基于 cmets: 没有像 JSON Object 这样的东西。有 JSON 字符串,可以是 parsed 到 Javascript 对象。 Javascript 对象可以是 stringified 到 JSON 字符串。在 JSON 字符串中,键和值被引用。所以上面的结果是一个包含'{"mykey":"my value"}'string

尝试在浏览器控制台中解析myObjJSON(使用:JSON.parse(myObjJSON)),你会得到:Object {mykey: "my value"}

【讨论】:

  • @Kooilnc 在您的回答中,即使 mykey 不是 JSON 标准指定的双引号,它也会转换为 JSON 字符串。“var myObj = {mykey: "my value"}"。当我使用带引号或不带引号的 mykey 对对象进行字符串化时,我得到了相同的结果。
  • @MohamedHussain 在 JavaScript 中,键不必用双引号括起来。
  • @ComFreek 你是对的。键不需要放在引号中,但对于 JSON,它们的键需要放在双引号中,我从 stackoverflow.com/questions/2904131/… 学到了这一点
  • @MohamedHussain:在 javascript Object 中不需要引用键名,除非键名包含空格。还要检查net.tutsplus.com/tutorials/javascript-ajax/…
  • @DenukaNirmalee 不确定您的意思,但您可以使用替换函数,例如 JSON.stringify({ "year": "2019", "month": "2", "day": "26" }, (key, value) => !isNaN(+value) ? +value : value)
【解决方案2】:

你对JSON.parse有一些误解

JSON.parse takes string and parse it to JAVASCRIPT object
JSON.stringify takes an object and parse it to a string

这就是为什么当您运行以下内容时

JSON.parse('{"a":"b"}')

它成功了,因为它需要一个 json 字符串

但是当你跑的时候

JSON.parse({"a":"b"})

不是因为对象被转换为字符串

"[object Object]"

这是错误,其中“[object Object]”在字母o处是无效语法

【讨论】:

    【解决方案3】:

    这段代码

    var jstr1 = {"mykey": "my value"};
    

    使用 Object Literal Notation 创建一个 JavaScript 对象。
    Object Literal NotationJSON(JON 是 JavaScript object notation 的缩写)之间的区别,请参见此处:What is the difference between JSON and Object Literal Notation?

    将此数据传递给JSON.parse() 从逻辑上讲是没有意义的。

    与您的第一个变体 (var jstr = '{"mykey": "my value"}';) 的不同之处在于它创建了一个“原始”字符串。除了原始字符序列外,您无法访问该字符串上的任何内容。使用JSON.parse() 为我们提供了一个从字符串创建的可用表单(对象)。

    SyntaxError: Unexpected token o

    这来自jstr1的自动字符串转换:

    jstr1.toString();
    // gives us [object Object]
    // ----------↑
    

    【讨论】:

      【解决方案4】:

      JSON.parse() 接受字符串并转换为 JSON 对象,它不接受 javascript 对象作为参数。参考JSON.parse()它可以给你如下结果

      JSON.parse('{}'); // {}
      JSON.parse('true'); // true
      JSON.parse('"foo"'); // "foo"
      JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
      JSON.parse('null'); // null
      

      并且确实知道 如果要解析的字符串不是有效的 JSON,则会引发 SyntaxError 异常。 所以这就是 jstr1 上出现语法错误的方式(它不是 JSON 字符串)

      【讨论】:

        【解决方案5】:

        这个怎么样:

        MarahJSONObject gtp = new MarahJSONObject()
            gtp.put("ecomm_prodid", "123")
            gtp.put("ecomm_pagetype", "cart")
            gtp.put("ecomm_totalvalue", "19.99")
        
        String r = gtp.toString()
            gtp.keySet().each {
                r = r.replace(/"${it}"/, it)
            }
            println r
        

        然后你会得到: {ecomm_pagetype:"cart",ecomm_prodid:"123",ecomm_totalvalue:"19.99"}

        【讨论】:

        • 这是什么??我不明白这如何解决手头的问题
        猜你喜欢
        • 2012-10-11
        • 1970-01-01
        • 2023-03-30
        • 2023-03-15
        • 1970-01-01
        • 2017-02-08
        • 2017-09-14
        • 1970-01-01
        • 2011-05-19
        相关资源
        最近更新 更多