采集數據的時候經常碰到一些JSON數據的Key值不是字符串,這些數據在JavaScript的上下文中是可以解析的,但在Python中,沒有該部分數據的上下文,無法采用json.loads(JSON)
的形式導入。在網上搜集來一些方法以便日后使用。
方法一:
def parse_js(expr):
"""
解析非標准JSON的Javascript字符串,等同於json.loads(JSON str)
:param expr:非標准JSON的Javascript字符串
:return:Python字典
"""
obj = eval(expr, type('Dummy', (dict,), dict(__getitem__=lambda s, n: n))())
return obj
方法二(推薦)
def parse_js(expr):
"""
解析非標准JSON的Javascript字符串,等同於json.loads(JSON str)
:param expr:非標准JSON的Javascript字符串
:return:Python字典
"""
import ast
m = ast.parse(expr)
a = m.body[0]
def parse(node):
if isinstance(node, ast.Expr):
return parse(node.value)
elif isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.Str):
return node.s
elif isinstance(node, ast.Name):
return node.id
elif isinstance(node, ast.Dict):
return dict(zip(map(parse, node.keys), map(parse, node.values)))
elif isinstance(node, ast.List):
return map(parse, node.elts)
else:
raise NotImplementedError(node.__class__)
return parse(a)