将字符串转换为json,其中一些值用方括号括起来

2024-09-27 04:19:06 发布

您现在位置:Python中文网/ 问答频道 /正文

string转换为dict的最有效方法是什么(python 3),其中一些键和值可能被引用,也可能不被引用,而一些值可能包含用方括号([])而不是卷曲的子对象

值中还可能包含冒号(:

例如:

string = "[key:value, key2:[key2a:val2:a, key2b:[foo:"bar"]]]"

结果必须是有效的dict,如:

{"key":"value", "key2":{"key2a":"val2:a", "key2b":{"foo":"bar"}}}


Tags: 对象方法keystringfoovaluebardict
1条回答
网友
1楼 · 发布于 2024-09-27 04:19:06

可以使用递归生成器函数:

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'}}}

编辑:不带赋值表达式的解决方案(:=walrus运算符):

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, j])
         v = ''.join(c)
      yield (n, v)
      n = next(d, None)


print(dict(to_dict(iter(d))))

相关问题 更多 >

    热门问题