2009-12-19 16 views
26

Ich habe einen folgender JSON-String von externer Eingangsquelle kommt:Wie falsch JSON mit Python zu analysieren?

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

Das ist falsch formatierte JSON-String („id“ und „Wert“ in Anführungszeichen gesetzt werden muss), aber ich muß es trotzdem analysieren. Ich habe versucht, Simplejson und Json-Py und scheint, dass sie nicht eingerichtet werden, solche Strings zu analysieren.

Ich verwende Python 2.5 auf Google App-Engine, so dass alle C-basierten Lösungen wie Python-Cjson nicht anwendbar sind.

Das Eingabeformat könnte in XML oder YAML geändert werden, zusätzlich zu JSON, das oben aufgeführt ist, aber ich benutze JSON innerhalb des Projekts und das Ändern des Formats an einem bestimmten Ort wäre nicht sehr gut.

Jetzt habe ich zu XML gewechselt und die Daten erfolgreich analysiert, aber ich freue mich auf jede Lösung, die es mir erlauben würde, zu JSON zurückzukehren.

+0

Ich bin ein wenig verwirrt darüber, wie Sie auf XML umstellen können, aber nicht die Kontrolle über die JSON-Daten haben. Es klingt wie eine externe Datenquelle, entweder im XML- oder im JSON-Format, aber die JSON-Ausgabe ist wie gezeigt dauerhaft unterbrochen, und Sie können nichts dagegen tun, sodass Sie nur die XML-Version auswählen können. Oder fehlt mir etwas? –

+0

Sie können es als YAML ohne eine Änderung analysieren, weil es auch YAML ist – mykhal

+0

Peter, du hast Recht - ich habe eine externe Quelle von Daten, die ich nur auf eine Art kontrollieren konnte - indem ich sage, dass ich eine Eingabe in JSON, XML oder YAML. Nadia, danke - das ist mein Fehler (und ich bin nicht vertraut mit Stackoverflow-Schnittstelle zu der Zeit). –

Antwort

31

seit YAML (> = 1.2) eine Ober von JSON ist, können Sie tun:

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

Nun, Python-Yaml (PyYAML) ist noch nicht vollständig 1.2-kompatibel, wird aber die meisten Fälle behandeln. um auf Problemfälle vorbereitet zu sein, siehe http://en.wikipedia.org/wiki/YAML#cite_ref-6 – mykhal

+0

mykhal, hast du es auf Google App Engine ausgeführt? Scheint PyYAML verwendet C-Module und kann daher nicht auf GAE verwendet werden. –

+0

pyyaml ​​ist viel schneller, wenn libyaml verwendet wird, aber es ist auch in pure python geschrieben, und Sie können zwischen CLoader o Loader (pure py) wählen. Aber keine Sorge, Yaml-Unterstützung ist bereits in der App-Engine enthalten, Sie können dies in der interaktiven Shell http://shell.appspot.com/ versuchen. – mykhal

1

Sie könnten einen String-Parser verwenden, um es zuerst zu beheben, ein Regex könnte es tun, vorausgesetzt, dass dies so kompliziert ist, wie der JSON erhalten wird.

+0

Das ist möglich, aber ich halte solche Art von Lösung für seltsam, also suche ich jetzt nur nach einer JSON-Parsing-Bibliothek, die dieses kaputte JSON verarbeiten könnte. –

0

Pyparsing enthält ein Beispiel JSON-Parser, hier ist die online source. Sie könnten die Definition von memberDef ändern, um eine Zeichenfolge ohne Anführungszeichen für den Elementnamen zuzulassen, und dann könnten Sie diese verwenden, um Ihren nicht-ganz-JSON-Quelltext zu analysieren.

This page hat auch Informationen und einen Link zu meinem Artikel in der August 2008 Ausgabe von Python Magazine, die viel detailliertere Informationen über diesen Parser hat. Die Seite zeigt einige Beispiel-JSON und Code, der auf die analysierten Ergebnisse zugreift, als ob es ein deserialisiertes Objekt wäre.

13

Sie können demjson verwenden.

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

Das hat mir geholfen, JSON ohne Anführungszeichen zu analysieren und mit Formatierung, die sich von Yaml – varela

+0

sehr hilfreiches Paket für die Analyse gebrochener JSON unterscheidet, danke – Johnner

Verwandte Themen