python 转 string 为 dict

方法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/

猜你喜欢

转载自blog.csdn.net/qq_42648305/article/details/113096555
今日推荐