我不得不花费两个小时左右的时间,但我认为我有一些能够根据您提供的格式工作的所有情况。如果没有,我相信这将是一个小小的改变。即使你只是提出这个想法,因为无论如何我都会编码它,下面是Python代码。
import json
def to_json(cust_str):
from_index = 0
left_indices = []
levels = {}
level = 0
for i, char in enumerate(cust_str):
if char == '[':
level += 1
left_indices.append(i)
if level in levels:
levels[level] += 1
else:
levels[level] = 1
elif char == ']':
level -= 1
level = max(levels.keys())
value_stack = []
while True:
left_index = left_indices.pop()
right_index = cust_str.find(']', left_index) + 1
values = {}
pairs = cust_str[left_index:right_index][1:-1].split(',')
if levels[level] > 0:
for pair in pairs:
pair = pair.split('=')
values[pair[0].strip()] = pair[1]
else:
level -= 1
for pair in pairs:
pair = pair.split('=')
if pair[1][-1] == ' ':
values[pair[0].strip()] = value_stack.pop()
else:
values[pair[0].strip()] = pair[1]
value_stack.append(values)
levels[level] -= 1
cust_str = cust_str[:left_index] + cust_str[right_index:]
if levels[1] == 0:
return json.dumps(values)
if __name__ == '__main__':
# Data in custom format
cust_str = '[root=Root [key1=value1, key2=value2, key3=Key3 [key3_1=value3_1, key3_2=value3_2, key3_3=Key3_3 [key3_3_1=value3_3_1]], key4=value4]]'
# Data in JSON format
json_str = to_json(cust_str)
print json_str
的想法是,我们绘制水平dict
一起去到自定义格式的数量,这是不对应于这些级别的字符串值的数量。除此之外,我们还跟踪给定字符串中[
字符的索引。然后,我们通过弹出包含[
(左侧)索引的堆栈并解析它们,从最里面的dict
开始。由于每个人都被解析,我们将它们从字符串中移除并继续。其余的你可以在代码中读取。
我运行它为您提供的数据,结果如下。
{
"root":{
"key2":"value2",
"key3":{
"key3_2":"value3_2",
"key3_3":{
"key3_3_1":"value3_3_1"
},
"key3_1":"value3_1"
},
"key1":"value1",
"key4":"value4"
}
}
为了确保它适用于更一般的情况,我使用了这个自定义字符串。
[root=Root [key1=value1, key2=Key2 [key2_1=value2_1], key3=Key3 [key3_1=value3_1, key3_2=Key3_2 [key3_2_1=value3_2_1], key3_3=Key3_3 [key3_3_1=value3_3_1]], key4=value4]]
并解析它。
{
"root":{
"key2":{
"key2_1":"value2_1"
},
"key3":{
"key3_2":{
"key3_2_1":"value3_2_1"
},
"key3_3":{
"key3_3_1":"value3_3_1"
},
"key3_1":"value3_1"
},
"key1":"value1",
"key4":"value4"
}
}
据我所知,它应该如何解析。另外,请记住,不要去掉这些值,因为逻辑取决于数值末尾的空格,而这些空格应该有dict
s作为值(如果这是有意义的)。
是'root','key1','key3_1'等等,这种格式的标准键名? – aa8y 2014-10-29 06:19:44