문제

Python의 Simplejson을 사용하여 JSON을 직렬화하는 웹 서비스와 Google 시각화를 사용하는 JavaScript/ Client가 있습니다. API. Google Data Table의 쿼리 메소드를 사용하여 JSON 응답을 읽으려고하면 "잘못된 레이블"오류가 발생합니다.

Google 스프레드 시트가 객체 키 주위에 따옴표없이 JSON을 출력하는 것을 알았습니다. 나는 인용문없이 JSON에서 독서를 시도했습니다. Simplejson 출력을 Google Datable을 사용하여 읽을 수있는 가장 좋은 방법이 무엇인지 궁금했습니다.

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

Regex를 사용하여 인용문을 제거 할 수는 있지만 조잡 해 보입니다. 내가 시도한 JavaScript JSON 구문 분석 라이브러리는 객체 키 주위에 따옴표없이 JSON 구문에서 읽지 않습니다.

다음은 좋은 배경 읽기 Re : 개체 키 주변의 인용문 :

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

도움이 되었습니까?

해결책

Google API가 JSON을 기대하고 있다고 확신하십니까? 내 경험상 Google의 API는 당신이 묘사하는 방식으로 크게 깨지지 않는 경향이 있습니다. 실제로 JSON과 유사한 다른 형식을 기대할 수 있습니다.


더 많은 Poking 주변에는 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

다른 팁

"유효하지 않은 레이블"오류는 일반적으로 JSON 문자열의 블라인드 평가 ()에 기인하여 속성 이름이 레이블로 오해됩니다 (동일한 구문 - "foo :").

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

빠른 구제책은 JSON 스트링이 Curly Braces를 둘러싸고있는 괄호가 있는지 확인하는 것입니다.

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

"유효하지 않은 레이블"오류가 사라지는 지 확인하려면 JSON 문자열을 괄호 안에 넣어보십시오.

결과적으로 : 모드 : JSON 또한 단일 따옴표로 문자열에서 질식 할 것입니다. 이것은 다음을 분류 할 것입니다.

파이썬에서 JSON으로 JavaScript 객체를 구문 분석 :

해결책:

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

편집하다: (엣지 케이스 검토)

따라서 제안 된 솔루션이 모든 경우에 대처하지 않고 특히

예를 들어 {foo : "문장 : 바로 여기!"}} { "foo": "a"sentence ": 바로 여기!"}로 변경됩니다.
- Jason S Apr 12 at 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!'} 

그러나 나는 이것이 인용문에 대해서는 유일한 결함이 아니라는 것을 지적했다.

우리가 또한 탈출 된 인용문에 대해 걱정한다면 우리는 문자열을 구성하는 것에 대해 약간 더 구체적이어야합니다. 첫 번째 인용문은 곱슬 브레이스 ({) A 공간 ( 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:

에서:

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

에게:

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

나를 위해 일한다 =)

조이!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top