2014-01-18 123 views
-1

我從應用程序中獲取數據,該應用程序返回似乎是JSON的東西,但帶有一些「對象」。例如:解析包含「對象」的JSON

{"rgEvtData":[new VisData(0,0,1,0,1,0,0,0,0,-1),new VisData(0,1,1,1,1,0,0,0,0,-1),new VisData(0,2,1,2,1,0,0,0,0,-1),new VisData(0,3,2,0,1,0,0,0,0,-1),new VisData(0,4,2,1,1,0,0,0,0,-1),new VisData(0,5,2,2,1,0,0,0,0,-1),new VisData(0,6,2,3,1,0,0,0,0,-1),new VisData(0,7,3,0,1,0,0,0,0,-1),new VisData(0,8,3,1,1,0,0,0,0,-1)]} 

,如果我可以分析它不髒的解決方法蟒蛇任何想法(即替代()或正則表達式)?

+0

你期望得到什麼? – thefourtheye

+3

看到這是怎麼回事 - 出於很好的理由 - 無效的JSON,不知何故,我懷疑你會找到一個內置庫很幸運。用一個無法解決的問題毆打原始應用程序的作者? – millimoose

+0

我之前沒有聽說過用棍子的方法毆打,但在這種情況下它是有意義的,因爲這種情況下專有格式的整個想法是荒謬的。看起來像誰寫這個假設他們的用戶會通過JavaScript獲取這些數據並對其進行評估。 *不寒而慄*。你如何獲得這些數據到你的Python應用程序? –

回答

1

不,你不能。
即使python可以解析它,它會怎樣處理VisData

我認爲你唯一的選擇(除了提到的棒方法),以某種方式將此字符串轉換爲有效的JSON。例如,如果您有多個類名,則用[...]{"class": "VisData", "args": [...]}替換new VisData(...)。但你說你不想要那個。

更新
我有一個例子,我認爲這是你需要的。
它以您提供的格式處理自定義類。它也會處理多個類和任何數量/類型的構造函數參數。

import re 
import json 

# our python VisData class 
class VisData(object): 
    def __init__(self, *args): 
     self.args = args 

# object hook to convert our {"class":"VisData","args":[...]} dict to VisData insances 
def object_hook(obj): 
    # if we recognize our object describer dict 
    if len(obj) == 2 and "class" in obj and "args" in obj: 
     # instantiate our classes by name 
     clazz = globals()[obj["class"]] 
     args = obj["args"] 
     return clazz(*args) 
    return obj 

# input 
input_string = '{"rgEvtData":[new VisData(0,0,1,0,1,0,0,0,0,-1),new VisData(0,1,1,1,1,0,0,0,0,-1)]}' 

# make it json 
json_string = re.sub(r'new (\w+)\(([^\)]*)\)', r'{"class":"\1","args":[\2]}', input_string) 

# parse it with our object hook 
data = json.loads(json_string, object_hook=object_hook) 

# result 
print(data)       # -> {u'rgEvtData': [<__main__.VisData object at 0x1065d8210>, <__main__.VisData object at 0x1065d8250>]} 
print(data["rgEvtData"][0])   # -> <__main__.VisData object at 0x1065d8210> 
print(data["rgEvtData"][0].args) # -> (0, 0, 1, 0, 1, 0, 0, 0, 0, -1) 
+0

我希望有一種方法可以在python上創建一個VisData類,並且可以將它轉換爲這個類的一個對象,但是我知道這是一個很長的鏡頭:( – Lem0n

+0

)如果您創建在Python中'VisData'類,那麼你可以很容易地根據我提到的解析對象中的類&args字典來實例化。 – zord

+0

你能檢查我的例子嗎? – zord