我不得不花費兩個小時左右的時間,但我認爲我有一些能夠根據您提供的格式工作的所有情況。如果沒有,我相信這將是一個小小的改變。即使你只是提出這個想法,因爲無論如何我都會編碼它,下面是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