2014-08-29 116 views
0

我有一个像这样的字符串:分割字符串,并转换为JSON

{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"] 

而之前[“EQ(‘2’......所以我只需要保存我只需要的一切{'4':{1,2},'2':{1,2},'0':{1,2}} 我无法使用索引,因为每次都会有不同的长度,所以我必须检查“[”。有没有反正在Python中做到这一点,然后将结果转换成json?我是python新手,所以我会很感激任何帮助

+2

“蟒蛇中是否有这样做”是的。 ['str.split'](https://docs.python.org/2/library/string.html#string.split)是你的朋友。“然后将结果转换成json”是的,[有一个用于json的完整模块](https://docs.python.org/2/library/json.html) – 2014-08-29 23:15:35

+1

@AdamSmith:除了给出的值不能可以直接编码为JSON,因为它包含集合。一旦你决定如何将这些设置包含在JSON包含的内容中,这并不难,但在此之前这是不可能的。 – abarnert 2014-08-29 23:23:43

+0

为什么你有两个JSON序列化连接在一起?无论如何,任何不涉及解析器的解决方案都将变得很脆弱,因为您没有跟踪对象树中的深度。 – 2014-08-29 23:24:09

回答

1

如果格式实际上是这个特定的,那很简单:只是分割为[,因为没有[内部{…}。所以:

>>> s = """{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}["eq('2', '0')", "eq('2', '4')", "eq('0','4')"]""" 
>>> sd, _, sl = s.partition('[') 
>>> sl = '[' + sl 

现在,想必你不想给转换成JSON,但dict该字符串代表。要做到这一点,你必须eval它。因为除了显示全部文字之外什么都没有,所以您可以使用安全ast.literal_eval函数来执行此操作。所以:

>>> import ast 
>>> d = ast.literal_eval(sd) 
>>> sd 
"{'4': {1, 2}, '2': {1, 2}, '0': {1, 2}}" 
>>> d 
{'2': {1, 2}, '4': {1, 2}, '0': {1, 2}} 

但是,你仍然不能JSON-IFY,因为{1, 2}是一个集合,JSON没有做套。你必须决定你想要转换成什么。数组?有None值的字典?还有别的吗?


把所有的套入名单(可呈现为JSON数组),你有两个选择。

第一个是子类JSONEncoderthe docs顶部附近有一个很好的例子,它可以将complex值作为2元素列表进行编码,您应该能够轻松地适应您的目的:将complex更改为set,将[o.real, o.imag]更改为list(o)

第二个是预处理东西。就像最初的解析一样,这很容易取决于你的格式有多严格。如果字典中的所有顶级值都是集合,并且其他都不是集合,则只是{k: list(v) for k, v in sd.items()}。另一方面,如果你有一个任意的字典,递归地包含字符串,数字,字典和列表的集合,那么你可能想写一个递归函数来转换它。


同时......您从哪里得到这些数据?我的猜测是你有一些其他你的代码的一部分,只是打印出一个字典(或f.write -ing一个字典的str() ...),然后是一个列表。如果是这样,而不是稍后尝试恢复该数据,则应该将代码更改为首先编写JSON(或其他可解析的内容)。


如果您的格式是有点不那么友好,如果字典可以有名单里面 - 你会需要做一些票友。例如,你可以计算开放大括号减去大括号并继续下去,直到你回到0,这就是字典。

+0

感谢您的帮助,比方说,我想将{1,2}更改为数组[1,2]。我发送这个数据到JavaScript,所以我需要迭代json对象中的每个项目,并阅读它的数组 – 2014-08-30 00:08:32

+0

@HiradRoshandel:编辑答案解释。 – abarnert 2014-08-30 00:32:23