2009-12-19 20 views
26

Mam następujący JSON ciąg pochodzący z zewnętrznego źródła sygnału wejściowego:Jak parsować nieco źle JSON z Pythonem?

{value: "82363549923gnyh49c9djl239pjm01223", id: 17893} 

Jest źle sformatowane JSON string („id” i „wartość” musi być w cudzysłowie), ale muszę przeanalizować go i tak. Próbowałem simplejson i json-py i wydaje się, że nie można ich skonfigurować do analizowania takich łańcuchów.

Korzystam z Pythona 2.5 na silniku aplikacji Google, więc wszelkie rozwiązania oparte na C, takie jak python-cjson, nie mają zastosowania.

Format wejściowy można zmienić na XML lub YAML, w dodatku do JSON wymienionego powyżej, ale używam JSON w projekcie i zmiana formatu w określonym miejscu nie byłaby zbyt dobra.

Teraz przełączyłem się na XML i pomyślnie analizowałem dane, ale czekam na każde rozwiązanie, które pozwoli mi przełączyć się z powrotem do JSON.

+0

Jestem trochę zdezorientowany tym, jak można przełączyć się na XML, ale nie mieć wpływu na dane JSON. Wygląda na to, że masz jakieś zewnętrzne źródło danych w formatach XML lub JSON, ale jego wyjście JSON jest trwale zepsute, jak pokazano, i nie możesz nic z tym zrobić, więc jedyną opcją jest wybranie wersji XML zamiast? Czy może czegoś brakuje? –

+0

możesz parsować go jako YAML bez zmiany, ponieważ to jest YAML też – mykhal

+0

Peter, masz rację - mam zewnętrzne źródło danych, które mogłem kontrolować tylko w jeden sposób - mówiąc, że chcę wejść w JSON, XML lub YAML. Nadia, dzięki - to mój błąd (i ze względu na to, że nie jestem zaznajomiony z interfejsem Stackoverflow w tym czasie). –

Odpowiedz

31

od YAML (> = 1.2) jest rozszerzeniem JSON, można zrobić:

>>> import yaml 
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}' 
>>> yaml.load(s) 
{'id': 17893, 'value': '82363549923gnyh49c9djl239pjm01223'} 
+0

dobrze, python-yaml (PyYAML) nie jest jeszcze w pełni zgodny z 1.2, ale obsłuży większość przypadków. być przygotowanym na problemy, zobacz http://en.wikipedia.org/wiki/YAML#cite_ref-6 – mykhal

+0

mykhal, czy uruchomiłeś go w Google App Engine? Wydaje się, że PyYAML używa modułów C i dlatego nie może być stosowany w GAE. –

+0

pyyaml ​​jest znacznie szybszy, jeśli korzystasz z libyaml, ale jest również napisany czystym pythonem i możesz wybrać pomiędzy CLoader o Loader (czysty py). Ale nie martw się, obsługa yaml jest już zawarta w silniku aplikacji, możesz spróbować tego w interaktywnej powłoce http://shell.appspot.com/ – mykhal

1

Najpierw można użyć parsera napisów, regex może to zrobić pod warunkiem, że jest to tak skomplikowane, jak JSON.

+0

Jest to możliwe, ale uważam takie rozwiązanie za dziwne, więc na razie szukam tylko biblioteki parsingowej json, która mogłaby przetworzyć to zepsute JSON. –

0

Pyparsing zawiera przykład parsera JSON, tutaj jest online source. Można zmodyfikować definicję elementu memberDef, aby zezwolić na łańcuch nie będący cudzysłowem dla nazwy elementu, a następnie można użyć tego do zanalizowania tekstu źródłowego niezupełnie-JSON.

This page ma również informacje i link do mojego artykułu w sierpniowym wydaniu magazynu Python, który ma o wiele więcej szczegółowych informacji o tym parserze. Strona pokazuje przykładowy JSON i kod, który uzyskuje dostęp do przeanalizowanych wyników, tak jak był to obiekt z deserializacją.

13

Można użyć demjson.

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
+0

Pomogło mi to parsować JSON bez cytowań i formatowania, który różni się od yaml – varela

+0

bardzo pomocnym pakietem do analizy uszkodzonego json, dzięki – Johnner