方法1json.loads
ほとんどのシナリオでは、問題はありません
。文字列内の引用符は二重引用符である必要があります
。シリアライザーの後に取得される文字列は一重引用符です。。だからいいえ
>>> 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)
このように、Python辞書にロードすることができます
json.dumps(dict(a=1))
'{"a": 1}'
方法2ast.literal_eval
より強力ですが、特に一般的には使用されない場合があります
literal_eval(node_or_string)
式ノードまたはPython
式を含む文字列を安全に評価します。提供される文字列またはノードは、次の
Pythonリテラル構造のみで構成されます:文字列、バイト、数値、タプル、リスト、dict、
セット、ブール値、およびなし。
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/