2009-12-19 7 views
26

는 나는 다음과 같은 JSON 문자열이 외부 입력 소스에서 오는 있습니다Python으로 JSON을 잘못 해석하는 방법은 무엇입니까?

{value: "82363549923gnyh49c9djl239pjm01223", id: 17893} 

이 잘못된 형식의 JSON 문자열 ("ID"와 "가치"를 따옴표 여야가)이지만, 어쨌든 그것을 구문 분석 할 필요가있다. 나는 simplejson과 json-py를 시도해 보았고 그러한 문자열을 파싱하도록 설정할 수 없었던 것 같습니다.

Google App Engine에서 Python 2.5를 실행 중이므로 python-cjson과 같은 C 기반 솔루션을 사용할 수 없습니다.

위의 JSON에 따라 입력 형식을 XML 또는 YAML로 변경할 수 있지만 프로젝트 내에서 JSON을 사용하고 특정 위치의 형식을 변경하면 좋지 않을 수 있습니다.

이제 XML로 전환하고 데이터를 구문 분석했지만 JSON으로 다시 전환 할 수있는 솔루션을 기대하고 있습니다.

+0

XML로 전환하는 방법에 대해 약간 혼란 스럽지만 아직 JSON 데이터를 제어 할 수 없습니다. XML 또는 JSON 형식으로 외부 데이터 소스를 가지고있는 것처럼 들리지만 JSON 출력은 그림과 같이 영구적으로 분리되어 있으며 이에 대해 아무 것도 할 수 없기 때문에 유일한 대안은 XML 버전을 선택하는 것입니다. 또는 나는 무엇인가 놓치고 있냐? –

+0

YAML이므로 변경없이 YAML로 구문 분석 할 수 있습니다. – mykhal

+0

Peter, 맞아요. 한 가지 방법으로 만 제어 할 수있는 외부 데이터 소스가 있습니다. JSON, XML 또는 YAML. Nadia, 고마워 - 그게 내 실수 야. (당시 Stackoverflow의 인터페이스에 익숙하지 않았기 때문에). –

답변

31

할 수있다 :

>>> import yaml 
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}' 
>>> yaml.load(s) 
{'id': 17893, 'value': '82363549923gnyh49c9djl239pjm01223'} 
+0

잘, python-yaml (PyYAML)은 아직 완전하게 1.2를 준수하지는 않지만 대부분의 경우를 처리 할 것입니다. 문제 사례를 대비하려면 http://en.wikipedia.org/wiki/YAML#cite_ref-6 – mykhal

+0

mykhal을 참조하십시오. Google App Engine에서 실행 했습니까? PyYAML은 C 모듈을 사용하므로 GAE에서 사용할 수 없습니다. –

+0

pyyaml은 libyaml을 사용하는 경우 훨씬 빠르지 만 순수 python으로 작성되어 있으므로 CLoader o Loader (pure py) 중에서 선택할 수 있습니다. 하지만 yaml 지원이 이미 앱 엔진에 포함되어 있으므로 걱정하지 마세요. 대화 형 셸 http://shell.appspot.com/ – mykhal

1

문자열 분석기를 사용하여 먼저 해결할 수 있습니다. JSON이 얻는 것만 큼 복잡한 경우 정규 표현식을 사용할 수 있습니다.

YAML은 (> = 1.2) JSON의 수퍼 때문에
+0

이것은 가능하지만 이상한 솔루션과 같은 유형을 고려하고 있습니다. 그래서 지금은이 JSON을 처리 할 수있는 json 파싱 라이브러리를 찾고 있습니다. –

0

대한 파싱은 여기서, JSON 파서 예를 포함 online source이다. memberDef의 정의를 수정하여 멤버 이름에 인용 부호가없는 문자열을 허용 할 수 있습니다. 그러면이 태그를 사용하여 JSON 소스가 아닌 텍스트를 파싱 할 수 있습니다.

This page도이 파서에 대한 더 자세한 정보가 담긴 2008 년 8 월호에서 필자의 기사에 대한 정보와 링크가 있습니다. 이 페이지에는 샘플 JSON과 deserialize 된 객체 인 것처럼 구문 분석 된 결과에 액세스하는 코드가 표시됩니다.

13

demjson을 사용할 수 있습니다.

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
+0

JSON을 따옴표없이 구문 분석하고 yaml과 다른 서식을 사용하는 데 도움이되었습니다 – varela

+0

깨진 json을 구문 분석하는 데 매우 유용한 패키지입니다. 감사합니다. – Johnner

관련 문제