Frage

Ich habe einen Webservice, der Python simplejson verwendet JSON zu serialisiert und ein Javascript / Client, der Google-Visualisierung verwendet API . Wenn ich versuche, in der JSON-Antwort mithilfe von Google-Datentabelle der Query-Methode zu lesen, ich bin einen „ungültige Bezeichnung“ Fehler.

bemerkte ich, dass Google-Tabelle gibt JSON ohne Anführungszeichen um den Objektschlüssel. Ich habe versucht, in JSON ohne die Anführungszeichen und das Arbeiten zu lesen. Ich frage mich, was der beste Weg, simplejson Ausgabe zu lesen in Google datable mit

bekommen

query = new google.visualization.Query("http://www.myuri.com/api/").

Ich kann einen regulären Ausdruck verwenden, um die Anführungszeichen zu entfernen, aber das scheint schlampig. Die Javascript JSON Parsen Bibliotheken Ich habe versucht, nicht ohne Anführungszeichen um den Objektschlüssel in JSON-Syntax lesen.

Hier ist eine gute Hintergrund Lesung re: Anführungszeichen um Objektschlüssel:

http://simonwillison.net/2006/Oct/11/json/.

War es hilfreich?

Lösung

Sind Sie sicher, dass die Google API JSON erwartet? Nach meiner Erfahrung APIs von Google ist in der Regel nicht massiv in einer Art und Weise gebrochen werden Sie beschreiben - es könnte sein, dass sie erwarten eigentlich ein anderes Format, das nur JSON ähnelt

.

Stossen Weiteres um Anweisungen für das Abrufen von Daten im Format zeigt Google erwartet:

  

Um zum Beispiel die dataSourceUrl zu erhalten   aus einer Google-Tabelle, tut das   Folgendes ein:

     
      
  1. In Ihrer Tabelle, wählen Sie den Bereich von Zellen.
  2.   
  3. Wählen Sie 'Einfügen' und dann auf 'Gadget' aus dem Menü.
  4.   
  5. Öffnen Sie das Menü des Gadget, indem Sie auf der rechten oberen Selektor klicken.
  6.   
  7. Wählen Sie Menü-Option 'Get Datenquelle URL'.
  8.   

Ich tat dies und öffnete die URL in meinem Browser. Die Daten, die er zurückkehrte, war sicher nicht JSON:

google.visualization.Query.setResponse(
{requestId:'0',status:'ok',signature:'1464883469881501252',
table:{cols: [{id:'A',label:'',type:'t',pattern:''},
{id:'B',label:'',type:'t',pattern:''}],
rows: [[{v:'a'},{v:'h'}],[{v:'b'},{v:'i'}],[{v:'c'},{v:'j'}],[{v:'d'},{v:'k'}],[{v:'e'},{v:'l'}],[{v:'f'},{v:'m'}],[{v:'g'},{v:'n'}]]}});

Es sieht aus wie das Ergebnis soll direkt vom Browser ausgeführt werden. Versuchen Sie, Ihren Code zu ändern, so etwas zu tun:

# old
return simplejson.dumps ({"requestId": 1, "status": "ok", ...})

# new
json = simplejson.dumps ({"requestId": 1, "status": "ok", ...})
return "google.visualization.Query.setResponse(%r);" % json

Andere Tipps

Die „ungültige Bezeichnung“ Fehler sind in der Regel aufgrund eines blinden eval () auf der Saite JSON, in Eigenschaftsnamen resultierende verwechselt als Etikett (weil sie die gleiche Syntax haben - „foo“).

eval("{ foo: 42, bar: 43 }"); // Results in invalid label

Die schnelle Abhilfe ist Ihr JSON-String hat Klammer umschließt die geschweiften Klammern um sicherzustellen, dass:

eval("({ foo: 42, bar: 43 })"); // Works

Versuchen Sie, Ihr JSON-String in Klammern umschließt, um zu sehen, ob die „ungültige Bezeichnung“ Fehler weggeht.

Wie sich herausstellt : mod: json würde ersticken auch bei Strings in einfachen Anführungszeichen. Dies wird die Dinge in Ordnung bringt aber:

Parse JavaScript-Objekt als JSON in Python:

Lösung:

>>> from re import sub
>>> import json
>>> js = "{ a: 'a' }"
>>> json.loads(sub("'", '"', sub('\s(\w+):', r' "\1":', js)))
{u'a': u'a'}

Edit: (Grenzfälle überprüft)

So wurde es gebracht, dass die vorgeschlagene Lösung würde mit allen Fällen nicht zu bewältigen und speziell mit so etwas wie

  

z. {Foo: "a Satz: hier"} wird erhalten geändert { "foo": "a "Satz": hier!"}
  - Jason S 12. April um 18:03 Uhr

zu beheben, dass wir müssen einfach sicherstellen, dass wir in der Tat mit einem Schlüssel zu arbeiten und nicht nur ein Doppelpunkt in einer Reihe, so dass wir ein wenig Blick hinter Magie zu einem Komma (,) oder eine geschweifte Klammer andeuten ({ Präsenz), um sicherzustellen, haben wir es für richtig, etwa so:

Kolon in string:

>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub("'", '"', sub('(?<={|,)\s*(\w+):', r' "\1":', js)))
{u'foo': u'a sentence: right here!'}

Was natürlich ist die gleiche wie zu tun:

>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub('(?<={|,)\s*(\w+):', r' "\1":', js).replace("'",'"'))
{u'foo': u'a sentence: right here!'} 

Aber dann habe ich darauf hingewiesen, dass dies nicht der einzige Fehler ist, weil das, was über Zitate:

Wenn wir auch besorgt über entgangene Zitate sind wir etwas präziser als sein müssen, was eine Zeichenfolge darstellt. Das erste Zitat folgt entweder einer geschweifte Klammer ({) einen Raum (\ n) oder einen Doppelpunkt (:), während das letzte passende Zitat bevor entweder ein Komma kommen wird (,) oder eine schließende geschweiften Klammer (}), dann können wir davon ausgehen alles dazwischen als Teil derselben Saite, etwa so:

weitere Zitate in string:

>>> js = "{foo: 'a sentence: it\'s right here!'}"
>>> json.loads(
...     sub("(?<=\s|{|:)'(.*?)'(?=,|})", 
...         r'"\1"', 
...         sub('(?<={|,)\s*(\w+):', r' "\1":', js))
...     )
{u'foo': u"a sentence: it's right here!"}

Sehen Sie diesen Raum als weitere Grenzfälle aufgedeckt und gelöst. Können Sie sich eine andere Stelle?

Oder etwas komplexen vielleicht ein Beispiel aus der Praxis, wie durch npm view zurückgegeben:

Von:

  

{ name: 'chuck',
      description: 'Chuck Norris joke dispenser.',
      'dist-tags': { latest: '0.0.3' },
      versions: '0.0.3',
      maintainers: 'qard ',
      time: { '0.0.3': '2011-08-19T22:00:54.744Z' },
      author: 'Stephen Belanger ',
      repository: 
           { type: 'git',
             url: 'git://github.com/qard/chuck.git' },
          version: '0.0.3',
          dependencies: { 'coffee-script': '>= 1.1.1' },
          keywords: 
               [ 'chuck',
                 'norris',
                 'jokes',
                 'funny',
                 'fun' ],
              bin: { chuck: './bin/chuck' },
              main: 'index',
              engines: { node: '>= 0.4.1 < 0.5.0' },
              devDependencies: {},
              dist: 
                   { shasum: '3af700056794400218f99b7da1170a4343f355ec',
                     tarball: 'http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz' },
                  scripts: {},
                  directories: {},
                  optionalDependencies: {} }

An:

  

{u'author': u'Stephen Belanger ',
     u'bin': {u'chuck': u'./bin/chuck'},
     u'dependencies': {u'coffee-script': u'>= 1.1.1'},
     u'description': u'Chuck Norris joke dispenser.',
     u'devDependencies': {},
     u'directories': {},
     u'dist': {u'shasum': u'3af700056794400218f99b7da1170a4343f355ec',
      u'tarball': u'http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz'},
     u'dist-tags': {u'latest': u'0.0.3'},
     u'engines': {u'node': u'>= 0.4.1 < 0.5.0'},
     u'keywords': [u'chuck', u'norris', u'jokes', u'funny', u'fun'],
     u'main': u'index',
     u'maintainers': u'qard ',
     u'name': u'chuck',
     u'optionalDependencies': {},
     u'repository': {u'type': u'git', u'url': u'git://github.com/qard/chuck.git'},
     u'scripts': {},
     u'time': {u'0.0.3': u'2011-08-19T22:00:54.744Z'},
     u'version': u'0.0.3',
     u'versions': u'0.0.3'}

Funktioniert bei mir =)

nJoy!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top