【问题标题】:Loading JSON object with special values as a string将具有特殊值的 JSON 对象作为字符串加载
【发布时间】:2013-02-11 01:06:09
【问题描述】:

我正在尝试创建一个字符串 JSON 对象以使用 json 模块加载;但是,我遇到了一些麻烦,因为我的一些值是 python TrueFalse 而不是 unicode 字符串。例如,我想做以下事情:

>>> newDict = json.loads(u'{"firstKey": True, "secondKey": False}')
>>> newDict.get('firstKey') == True
True

但我得到了:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
    obj, end = self._scanner.iterscan(s, **kw).next()
  File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
    rval, next_pos = action(m, context)
  File "/usr/lib64/python2.6/json/decoder.py", line 185, in JSONObject
    raise ValueError(errmsg("Expecting object", s, end))
ValueError: Expecting object: line 1 column 13 (char 13)

当然,如果我将 TrueFalse 更改为 "True""False",我的条件也不满足,因为它们现在是字符串,并且将返回 False

【问题讨论】:

    标签: javascript python json


    【解决方案1】:

    你能用小写的truefalse吗?

    >>> import json
    >>> d = {'firstKey': True, 'secondKey': False}
    >>> json.dumps(d)
    '{"secondKey": false, "firstKey": true}'
    >>> s = json.dumps(d)
    >>> json.loads(s) == d
    True
    

    【讨论】:

    • ... 这是因为 JSON 代表“JavaScript 对象表示法”,所以它必须是有效的 JavaScript,而不是 Python。而且JS确实使用truefalse
    • @Sergey:不管它在 JavaScript 中如何,它必须符合 JSON 规范:json.org。当然 JSON 是仿照 JavaScript 对象字面量建模的,但它们是两种独立的技术。
    • @FelixKling:来自 json.org 的首页:“(JSON)基于 JavaScript 编程语言的一个子集......”,以及“JSON 是 JavaScript 的对象文字符号的一个子集. 由于 JSON 是 JavaScript 的一个子集,因此可以在语言中使用它而不会大惊小怪。”。我只是试图向 OP 解释为什么 JSON 使用 JavaScript 语法(一个子集)而不是 Python 语法。在这方面非常相似,但有一些细微的差别。
    • @Sergey:好的,我明白了。当人们说一些听起来像“JSON 是 JavaScript”的东西时,我只是有点敏感,因为这会在以后导致很多混乱。但是将其与 Python 进行对比是有道理的。没有难过的感觉!
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 2020-03-01
    • 2017-11-13
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多