2014-01-18 4 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 и «eval». * Вздрагивает *. Как вы получаете эти данные в своем приложении Python? –

ответ

1

Нет, вы не можете.
Даже если python смог разобрать его, что бы он сделал с VisData?

Я думаю, что ваш единственный вариант (кроме упомянутого подхода к палочке), чтобы перевести эту строку в действительный JSON каким-то образом. Например, заменив new VisData(...) на [...] или {"class": "VisData", "args": [...]}, если у вас есть несколько классов. Но ты сказал, что не хочешь этого.

Update
У меня есть пример, я думаю, что это то, что вам нужно.
Он обрабатывает пользовательские классы в указанном вами формате. Он также обрабатывал бы несколько классов и любые аргументы конструктора типа/типа.

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

Я надеялся, что существует способ создать класс VisData на python, и он сможет преобразовать его в объект этого класса, но я знал, что это был длинный снимок :( – Lem0n

+0

Если вы создаете 'VisData' в python, то вы можете легко создать экземпляр, основанный на аргументах class & args в анализируемом объекте, о котором я упоминал. – zord

+0

Вы смогли проверить мой пример? – zord

Смежные вопросы