我有一个字符串,我评价为:
import ast
def parse(s):
return ast.literal_eval(s)
print parse(string)
{'_meta': {'name': 'foo', 'version': 0.2},
'clientId': 'google.com',
'clip': False,
'cts': 1444088114,
'dev': 0,
'uuid': '4375d784-809f-4243-886b-5dd2e6d2c3b7'}
但是当我使用jsonlint.com来验证上面的json时.. 它会抛出架构错误..
如果我尝试使用json.loads 我看到以下错误:
Try: json.loads(str(parse(string)))
ValueError: Expecting property name: line 1 column 1 (char 1)
我基本上试图在avro How to covert json string to avro in python?
中转换这个json答案 0 :(得分:3)
ast.literal_eval()
加载 Python语法。它不会解析JSON,这是json.loads()
函数的用途。
将Python对象转换为str()
的字符串仍然是Python语法,而不是JSON语法,这是json.dumps()
的用途。
JSON不是Python语法。 Python使用None
,其中JSON使用null
; Python使用True
和False
来表示布尔值,JSON使用true
和false
。 JSON字符串始终使用"
双引号,Python使用单引号或双引号,具体取决于内容。使用Python 2时,字符串包含 bytes ,除非您使用unicode
个对象(在其文字符号上可以通过u
前缀识别),但JSON字符串完全支持Unicode。 Python将使用\xhh
表示ASCII以外的Latin-1范围内的Unicode字符,\Uhhhhhhhh
表示非BMP unicode点,但JSON只使用\uhhhh
代码。通常应将JSON整数视为仅限于C double
类型可表示的范围(因为JavaScript数字始终是浮点数),Python整数除了适合您的内存之外没有任何限制。
因此,JSON和Python语法不可互换。您不能在Python对象上使用str()
,并期望将其解析为JSON。您无法使用json.dumps()
并使用ast.literal_eval()
进行解析。不要混淆两者。