JSON 직렬화의 변형을 처리하는 적절한 방법
-
05-07-2019 - |
문제
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 : 개체 키 주변의 인용문 :
해결책
Google API가 JSON을 기대하고 있다고 확신하십니까? 내 경험상 Google의 API는 당신이 묘사하는 방식으로 크게 깨지지 않는 경향이 있습니다. 실제로 JSON과 유사한 다른 형식을 기대할 수 있습니다.
더 많은 Poking 주변에는 Google이 기대하는 형식으로 데이터를 검색하기위한 지침이 나타납니다.
예를 들어 Google 스프레드 시트에서 DataSourceurl을 얻으려면 다음을 수행하십시오.
- 스프레드 시트에서 셀 범위를 선택하십시오.
- 메뉴에서 '삽입'을 선택한 다음 '가제트'를 선택하십시오.
- 오른쪽 상단 선택기를 클릭하여 가제트 메뉴를 엽니 다.
- 메뉴 옵션 '데이터 소스 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'}
나를 위해 일한다 =)
조이!