2

Python の SimpleJSON を使用して JSON をシリアル化する Web サービスと、Google の Visualization APIを使用する javascript/ クライアントがあります。Google Data Table の Query メソッドを使用して JSON 応答を読み込もうとすると、「無効なラベル」エラーが発生します。

Google スプレッドシートは、オブジェクト キーを引用符なしで JSON を出力することに気付きました。引用符なしで JSON を読み込もうとしましたが、うまくいきました。SimpleJSON の出力を Google のデータに読み込むための最良の方法は何だろうと思っていました

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

正規表現を使用して引用符を削除できますが、それはずさんなようです。私が試したJavaScript JSON解析ライブラリは、オブジェクトキーを引用符で囲まないとJSON構文を読み取れません。

ここにいくつかの良い背景の読み物があります re: オブジェクトキーの周りの引用符:

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

4

3 に答える 3

3

Google API が JSON を想定していると確信していますか? 私の経験では、Google の API は、あなたが説明しているような方法で大規模に破損することはありません。実際には、単に JSON に似た別の形式を期待している可能性があります。


さらに調べてみると、Google が期待する形式でデータを取得するための手順が明らかになります。

たとえば、Google スプレッドシートから dataSourceUrl を取得するには、次のようにします。

  1. スプレッドシートで、セルの範囲を選択します。
  2. メニューから「挿入」→「ガジェット」を選択します。
  3. 右上のセレクターをクリックして、ガジェットのメニューを開きます。
  4. メニュー オプションの [データ ソース URL を取得] を選択します。

これを実行して、ブラウザで URL を開きました。返されたデータは確かに 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'}]]}});

結果はブラウザによって直接実行されることを意図しているようです。コードを次のように変更してみてください。

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

# new
json = simplejson.dumps ({"requestId": 1, "status": "ok", ...})
return "google.visualization.Query.setResponse(%r);" % json
于 2008-10-07T00:19:43.030 に答える
1

「無効なラベル」エラーは通常、JSON 文字列に対するブラインド eval() が原因であり、その結果、プロパティ名がラベルと間違えられます (構文が同じ「foo:」であるため)。

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

簡単な解決策は、JSON 文字列に中かっこを囲むかっこがあることを確認することです。

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

JSON 文字列を括弧で囲んで、「無効なラベル」エラーが解消されるかどうかを確認してください。

于 2008-10-07T00:34:57.477 に答える
0

結局のところ、:mod:jsonは一重引用符で囲まれた文字列でもチョークします。ただし、これは物事を整理します:

Python で JavaScript オブジェクトを JSON として解析します。

解決:

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

編集:(エッジケースのレビュー)

そのため、提案された解決策がすべてのケース、特に次のようなものに対処するわけではないことが提起されました

例: {foo: "文: right here!"} は {"foo": "a "sentence": right here!"} に変更されます
– Jason S 4 月 12 日 18:03

これを解決するには、文字列内の単なるコロンではなく、実際にキーを操作していることを確認する必要があるため、魔法の背後にあるカンマ (,) または中括弧 ({) の存在を示唆するために少し調べます。次のように、適切であることを確認します。

文字列のコロン:

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

もちろん、これは次のことと同じです:

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

しかし、これが唯一の欠陥ではないことを指摘しました。

エスケープされた引用符についても懸念がある場合は、文字列を構成するものについてもう少し具体的にする必要があります。最初の引用符は中括弧 ({)、スペース (\s) またはコロン (:) のいずれかに続きますが、最後に一致する引用符はコンマ (,) または閉じ中括弧 (}) の前に来ます。次のように、その間のすべてを同じ文字列の一部として指定します。

文字列内の追加の引用符:

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

より多くのエッジ ケースが明らかになり、解決されるので、このスペースをご覧ください。別のものを見つけることができますか?

または、おそらくもっと複雑なものとして、 によって返される現実世界の例npm view:

から:

{ 名前: 'チャック',
      説明: 'チャック・ノリスのジョーク ディスペンサー',
      'dist-tags': { 最新: '0.0.3' },
      バージョン: '0.0.3',
      メンテナ: 'qard',
      時間: { '0.0.3': '2011-08-19T22:00:54.744Z' },
      著者:「スティーブン・ベレンジャー」、
      リポジトリ:
           { タイプ: 'git',
             URL: 'git://github.com/qard/chuck.git' },
          バージョン: '0.0.3',
          依存関係: { 'coffee-script': '>= 1.1.1' },
          キーワード:
               [「チャック」、
                 「ノリス」、
                 「冗談」、
                 '面白い'、
                 '楽しい' ]、
              ビン: { チャック: './ビン/チャック' },
              メイン: 'インデックス',
              エンジン: { ノード: '>= 0.4.1 < 0.5.0' },
              devDependencies: {},
              距離:
                   { shasum: '3af700056794400218f99b7da1170a4343f355ec',
                     tarball: ' http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz ' },
                  スクリプト: {},
                  ディレクトリ: {},
                  オプションの依存関係: {} }

に:

{u'author': u'Stephen Belanger ',
     u'bin': {u'chuck': u'./bin/chuck'},
     u'dependencies': {u'coffee-script': u'>= 1.1.1'},
     u'description': u'チャック・ノリスのジョーク ディスペンサー。',
     u'devDependencies': {},
     u'ディレクトリ': {},
     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'エンジン': {u'ノード': 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'バージョン': u'0.0.3',
     u'versions': u'0.0.3'}

私のために働く=)

nJoy!

于 2012-10-19T12:01:46.643 に答える