当value是json字符串时,python json.loads()失败

时间:2018-06-11 14:41:14

标签: python json

env:python 2.7

当我从db读取数据时,值为{"key": "{\"subKey\":\"subValue\"}"}。我想将它转换为json,代码是:

import json

def readValueFromDb():
  return '{"key": "{\"subKey\":\"subValue\"}"}'

jsonObject = json.loads(readValueFromDb())

但是出现异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/Cellar/python@2/2.7.15/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 380, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 12 (char 11)

我发现{"key": "{\"subKey\":\"subValue\"}"}{"key": "{"subKey":"subValue"}"}之间没有区别。

顺便说一句,该值是一个变量,因此我无法将其更改为原始字符串,因为我发现它的工作原理如下:

import json

jsonObject = json.loads(r'{"key": "{\"subKey\":\"subValue\"}"}')

那么,如果我想将值转换为json,我该怎么办?

我尝试将'\"'替换为'\\"',但却找不到'\"'。奇怪。

1 个答案:

答案 0 :(得分:0)

如果数据库中的数据与您描述的一样,那么您的代码示例应如下所示:

import json

def readValueFromDb():
    return '{"key": "{\\"subKey\\":\\"subValue\\"}"}'

jsonObject = json.loads(readValueFromDb())

你的对象看起来像:

print(jsonObject)
{u'key': u'{"subKey":"subValue"}'}

现在,可以解析内部JSON文档。

没有&#34;原始字符串&#34;,只有&#34;原始字符串文字&#34;。它是一种在代码中表示字符串的方法。如果您这样做(使用我上面的版本):

print(readValueFromDb())
{"key": "{\"subKey\":\"subValue\"}"}

然后你就会得到你声称在数据库中的内容。

只是在切线上,为什么数据库中的数据实际上不是这样的:

{"key": {"subKey": "subValue"}}

这是存储JSON对象的更合理的方式。