将字符串转换为 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))))