Python中不完全JSON字符串的反序列化

1 投票
2 回答
713 浏览
提问于 2025-04-15 21:13

我从一个基于XML的REST API那里得到了以下文本,

'd':4 'ca':5 'sen':1 'diann':2,6,8 'feinstein':3,7,9

我想把它转换成一个漂亮的Python字典:

{
    'd': [4],
    'ca': [5],
    'sen': [1],
    'diann': [2, 6, 8],
    'feinstein': [3, 7, 9]
}

我希望能避免使用正则表达式或者复杂的字符串处理,因为这个格式没有文档说明,可能会变动。我目前想到的最好方法是:

members = {}
for m in elem.text.split(' '):
    m = m.split(':')
    members[m[0].replace("'", '')] = map(int, m[1].split(','))
    return members

显然这个方法不太好,但它能工作,总比我现在其他的办法强。有没有更好的建议呢?

2 个回答

2

我其实挺喜欢ChristopheD的回答,但为了探索其他可能性,这里有一个方法:

eval("{" + s.replace(":", ":[").replace(" ", "], ") + "]}")

这个方法做了一些简单的替换,把字符串变成合法的Python代码,然后用eval把它转成一个字典。

这种方法的缺点有:

  1. eval是有风险的。如果输入的数据不可信(大多数情况下都是不可信的),那么你的系统可能会受到攻击。
  2. 这个方法有点简洁,但如果格式发生了变化,不容易转换成Python代码的话,它可能就不太灵活了。
2

我会把它改写成这样(唯一的区别是明确地命名了 m[0]m[1]):

members = {}
for m in elem.text.split(' '):
    key, value = m.split(':')
    members[key.replace("'", '')] = map(int, value.split(','))
    return members

不过,这段代码在我看来基本上是没问题的。也许可以写得更简短一点(但那样会降低可读性)。

撰写回答