Pergunta

Eu tenho um serviço web que usa simplejson do Python para serializar JSON e um javascript / cliente que Visualization usos do Google API . Quando eu tento ler na resposta JSON usando o método de consulta da tabela de dados do Google, eu estou recebendo um erro "rótulo inválido".

Eu observei que o Google planilha saídas JSON sem aspas em torno das chaves de objeto. Tentei ler em JSON sem as aspas e que funciona. Eu queria saber o que era a melhor maneira de obter uma saída simplejson para ser lido no Google datable usando

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

Eu poderia usar um regex para remover as aspas, mas que parece desleixado. As bibliotecas javascript JSON parsing eu tentei não vai ler na sintaxe JSON sem aspas em torno das chaves de objeto.

Aqui está uma boa leitura de fundo re: aspas em torno de chaves de objeto:

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

Foi útil?

Solução

Você está certo de que a API do Google está esperando JSON? Na minha experiência de APIs do Google tendem a não ser maciçamente partidos de um modo que você está descrevendo - pode ser que eles estão esperando realmente um formato diferente que apenas se assemelha JSON

.

Além disso bisbilhotando revela instruções para recuperar dados no formato Google espera:

Por exemplo, para obter o dataSourceUrl a partir de uma planilha do Google, faça o seguinte:

  1. Na sua planilha, selecione o intervalo de células.
  2. Selecione 'Inserir' e depois 'Gadget' a partir do menu.
  3. Abra o menu do gadget clicando no seletor superior direito.
  4. Selecione a opção de menu 'Obter URL fonte de dados'.

Eu fiz isso e abriu a URL no meu browser. Os dados que ele estava voltando certamente não era 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'}]]}});

Parece que o resultado se destina a ser executados diretamente pelo navegador. Tente modificar seu código para fazer algo como isto:

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

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

Outras dicas

O erro "rótulo inválido" é geralmente devido a um eval cego () na string JSON, resultando em nomes de propriedade que está sendo confundido como etiquetas (porque eles têm a mesma sintaxe - "foo:").

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

O remédio rápido é se certificar que sua string JSON tem parêntese colocando as chaves:

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

Tente encerrando sua string JSON entre parênteses para ver se o erro "rótulo inválido" vai embora.

Como se vê : mod: JSON também sufocar a strings em aspas simples. Isso vai resolver as coisas no entanto:

Parse JavaScript objeto como JSON em Python:

Solução:

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

Editar: (casos de ponta revisado)

Por isso, foi levantada de que a solução sugerida não iria lidar com todos os casos e, especificamente, com algo como

por exemplo. {Foo: "uma frase: aqui"} vai ser alterado para { "foo": "a "sentença": aqui!"}
- Jason S 12 de abril em 18:03

Para resolver que nós simplesmente precisamos garantir que estamos de fato trabalhando com uma chave e não simplesmente uma vírgula em uma string para que fazer um pouco de olhar para trás mágica para sugerir uma vírgula (,) ou um chaveta ({ ) presença para garantir que temos que adequada, assim:

colon em string:

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

Que, naturalmente, é o mesmo que fazer:

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

Mas então eu salientou que esta não é a única falha, porque o que acontece com citações:

Se nós também estamos preocupados com citações escaparam teremos que ser um pouco mais específico sobre o que constitui uma corda. A primeira citação seguirá quer um chaveta ({) um espaço (\ s) ou dois pontos (:), enquanto a última citação correspondente virá antes ou uma vírgula (,) ou um chave de fechamento (}), então podemos considerar tudo mais como parte da mesma cadeia, assim:

citações adicionais em seqüência:

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

Watch este espaço como mais casos extremos são revelados e resolvidos. você pode manchar o outro?

Ou para algo mais complexo, talvez, um exemplo do mundo real como retornado por npm view:

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

Para:

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

funciona para mim =)

Njoy!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top