如何解决将字符串转换为 json,其中一些值包含在方括号中
将 string
转换为 dict
的最有效方法是什么(python 3),其中某些键和值可能会或可能不会被引用,而某些值可能包含包装的子对象在方括号 ([]
) 中而不是花括号中。
值中也可能包含冒号 (:
)
示例:
string = "[key:value,key2:[key2a:val2:a,key2b:[foo:"bar"]]]"
结果必须是一个有效的 dict
,例如:
{"key":"value","key2":{"key2a":"val2:a","key2b":{"foo":"bar"}}}
解决方法
您可以使用递归生成器函数:
import re
string = "[key:value,key2:[key2a:val2:a,key2b:[foo:'bar']]]"
d = [i if not i.startswith("'") else i[1:-1] for i in re.findall("[\[\]]|:|'.*?'|\w+|,",string)[1:-1]]
def to_dict(d):
while (n:=next(d,None)) not in {None,']'}:
_ = next(d)
if (v:=next(d)) == '[':
v = dict(to_dict(d))
else:
c = [v]
while (j:=next(d)) not in {',',']'}:
c.append(j)
if j == ']':
d = iter([*d,j])
v = ''.join(c)
yield (n,v)
print(dict(to_dict(iter(d))))
输出:
{'key': 'value','key2': {'key2a': 'val2:a','key2b': {'foo': 'bar'}}}
编辑:没有赋值表达式的解决方案(:=
海象运算符):
def to_dict(d):
n = next(d,None)
while n not in {None,']'}:
_,v = next(d),next(d)
if v == '[':
v = dict(to_dict(d))
else:
c,j = [v],next(d)
while j not in {',']'}:
c.append(j)
j = next(d)
if j == ']':
d = iter([*d,v)
n = next(d,None)
print(dict(to_dict(iter(d))))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。