方法1 json.loads
大部分场景是没有问题的
需要string中的引号是双引号
这里序列化器之后拿到的string是单引号的。。所以不行
>>> json.loads(params['filter_extra'])
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec
exec(exp, global_vars, local_vars)
File "<input>", line 1, in <module>
File "/Users/luoqi/opt/anaconda3/envs/aiops_api_py36/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/Users/luoqi/opt/anaconda3/envs/aiops_api_py36/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/luoqi/opt/anaconda3/envs/aiops_api_py36/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
像这种就可以被loads成python字典
json.dumps(dict(a=1))
'{"a": 1}'
方法2 ast.literal_eval
更加强大,但是可能不是特别常用
literal_eval(node_or_string)
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
sets, booleans, and None.
params['filter_extra']
"{'sample': {'fields': [], 'filter': [{'field': 'value', 'expression': '> 100'}]}}"
ast.literal_eval(params['filter_extra'])
{
'sample': {
'fields': [], 'filter': [{
'field': 'value', 'expression': '> 100'}]}}
参考
https://www.geeksforgeeks.org/python-convert-string-dictionary-to-dictionary/