Python中不完全JSON字符串的反序列化
我从一个基于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
把它转成一个字典。
这种方法的缺点有:
eval
是有风险的。如果输入的数据不可信(大多数情况下都是不可信的),那么你的系统可能会受到攻击。- 这个方法有点简洁,但如果格式发生了变化,不容易转换成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
不过,这段代码在我看来基本上是没问题的。也许可以写得更简短一点(但那样会降低可读性)。