Question

J'ai un service Web qui utilise SimpleJSON pour sérialiser JSON avec Python et un javascript / client qui utilise la visualisation de Google API . Lorsque j'essaie de lire la réponse JSON à l'aide de la méthode de requête de Google Data Table, j'obtiens un "libellé non valide". Erreur.

J'ai remarqué que la feuille de calcul Google génère du JSON sans guillemets autour des clés d'objet. J'ai essayé de lire en JSON sans les guillemets et cela fonctionne. Je me demandais quel était le meilleur moyen de faire en sorte que les sorties de SimpleJSON soient lues dans Google datable à l'aide de

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

Je pourrais utiliser une expression rationnelle pour supprimer les guillemets, mais cela semble négligé. Les bibliothèques d'analyse JSON javascript que j'ai essayées ne liront pas la syntaxe JSON sans les guillemets autour des clés d'objet.

Voici quelques informations de base sur les citations autour des clés d’objet:

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

Était-ce utile?

La solution

Êtes-vous certain que l'API Google attend JSON? D'après mon expérience, les API de Google ne sont généralement pas cassées de la manière que vous décrivez. Il est possible qu'elles s'attendent à un format différent, qui ressemble simplement à JSON.

Des recherches approfondies révèlent des instructions pour récupérer des données dans le format attendu par Google:

  

Par exemple, pour obtenir le dataSourceUrl   depuis une feuille de calcul Google, faites la   suivant:

     
      
  1. Dans votre feuille de calcul, sélectionnez la plage de cellules.
  2.   
  3. Sélectionnez "Insérer" puis "Gadget" dans le menu.
  4.   
  5. Ouvrez le menu du gadget en cliquant sur le sélecteur en haut à droite.
  6.   
  7. Sélectionnez l'option de menu "Obtenir l'URL de la source de données".
  8.   

Je l'ai fait et j'ai ouvert l'URL dans mon navigateur. Les données qu'il renvoyait n'étaient certainement pas 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'}]]}});

Il semble que le résultat soit destiné à être exécuté directement par le navigateur. Essayez de modifier votre code pour faire quelque chose comme ça:

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

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

Autres conseils

Le " étiquette invalide " Cette erreur est généralement due à un eval aveugle () sur la chaîne JSON, ce qui a pour conséquence que les noms de propriété sont considérés à tort comme des libellés (car ils ont la même syntaxe - "foo:").

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

La solution rapide consiste à vérifier que la chaîne JSON est entourée de parenthèses entourant les accolades:

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

Essayez de placer votre chaîne JSON entre parenthèses pour voir si le " étiquette invalide " l'erreur disparaît.

Comme il s'avère que : mod: json , les chaînes entre guillemets simples s'étoufferaient également. Cela réglera les choses cependant:

Analyser un objet JavaScript en tant que JSON en python:

solution:

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

Modifier: (cas marginaux examinés)

Il a donc été mentionné que la solution suggérée ne s'appliquerait pas à tous les cas et plus précisément à quelque chose comme

  

par exemple. {foo: "une phrase: ici!"} sera remplacé par {"foo": "une" phrase ": ici!!}
  & # 8211; Jason S 12 avril à 18h03

Pour résoudre ce problème, nous devons simplement nous assurer que nous travaillons avec une clé et non pas simplement un deux-points dans une chaîne. Nous allons donc regarder un peu derrière la magie pour suggérer une virgule (,) ou une accolade ({ ) présence pour s'assurer que tout est en ordre, comme ceci:

deux points dans la chaîne:

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

Ce qui bien sûr revient à faire:

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

Mais ensuite, j'ai souligné que ce n'est pas le seul défaut, car qu'en est-il des citations:

Si nous sommes également préoccupés par les citations échappées, nous devrons être un peu plus précis quant à ce qui constitue une chaîne. La première citation suivra soit une accolade ({) un espace (\ s) ou un deux-points (:), tandis que la dernière citation correspondante viendra avant une virgule (,) ou une accolade fermante (}), nous pourrons alors considérer tout ce qui est entre les deux dans la même chaîne, comme ceci:

guillemets supplémentaires dans la chaîne:

>>> 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!"}

Observez cet espace alors que de plus en plus d’affaires ont été révélées et résolues. Pouvez-vous en repérer un autre?

Ou pour quelque chose de plus complexe peut-être, un exemple du monde réel renvoyé par la vue npm :

De:

  

{ 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: {} }

Pour:

  

{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'}

Fonctionne pour moi =)

nJoy!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top