2009-07-05 6 views
20

모범 사례를 제쳐두고 설득력있는 이유가 있습니까 아니요 이렇게하려면 어떻게해야합니까?Python의 eval()을 통해 JSON을 실행 하시겠습니까?

JSON 객체를 통해 커밋 데이터를 제공하는 Google 코드 프로젝트에 사용할 커밋 후크를 작성하고 있습니다. GC는 JSON 데이터 외부의 요청과 함께 HMAC 인증 토큰을 제공하므로 토큰의 유효성을 검사하여 JSON 데이터가 양성 (Google을 신뢰할 수 없다는 점에서)하고 유효하다는 높은 확신을 얻습니다.

내 간단한 (간단한) 조사 결과에 따르면 "\/" 이스케이프 시퀀스 (예외적으로 GC가 생성되지 않는 것)를 제외하고는 JSON이 완전히 유효한 Python으로 간주됩니다. 내가 eval()정말 유혹 찾고, 파이썬 2.4 (즉, 어떤 json 모듈)와 함께 일하고 있어요 그래서

.

편집 : 공식적으로, 나는 이것이 좋은 생각이다 묻는 하지 대단히입니다. 나는 입니다.은 그것이 아니라는 것을 알고 있으며,이 기술을 사용하여 결국이 기술을 어떤 미래의 프로젝트에도 사용할 수 있을지 의심 스럽습니다. 나는 단지 내가하는 경우 내가 어떤 종류의 문제를 겪을 것인지를 알고 싶었습니다. :-)

답변

28

잠시 동안 스크립트가 정상적으로 작동하고 익명으로 불분명 한 에지 케이스가 발생하는 경우에는 eval을 사용하십시오.

코드가 튼튼해야하는 것이 중요하면 simplejson을 추가 할 시간이 필요합니다. 속도 향상을 위해 C 부분이 필요하지 않으므로 몇 개의 .py 파일을 어딘가의 디렉토리에 덤프하는 것은 정말로 어렵지 않습니다.당신을 물지 수있는 무언가의 예로서

는, JSON은 유니 코드를 사용하여 평가 반환 str에 반면 simplejson는 유니 코드를 반환

>>> simplejson.loads('{"a":1, "b":2}') 
{u'a': 1, u'b': 2} 
>>> eval('{"a":1, "b":2}') 
{'a': 1, 'b': 2} 

편집 : 평가()가 다르게 작동 곳의 더 나은 예 :

>>> simplejson.loads('{"X": "\uabcd"}') 
{u'X': u'\uabcd'} 
>>> eval('{"X": "\uabcd"}') 
{'X': '\\uabcd'} 
>>> simplejson.loads('{"X": "\uabcd"}') == eval('{"X": "\uabcd"}') 
False 

편집 2 : 아직 오늘 SilentGhost 지적 다른 문제 보았다 : 평가 사실이 처리하지 않습니다 -> 참, 거짓 -> 거짓, 널 (null) -> 올바르게 없음.

>>> simplejson.loads('[false, true, null]') 
[False, True, None] 
>>> eval('[false, true, null]') 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "<string>", line 1, in <module> 
NameError: name 'false' is not defined 
>>> 
+4

+1에 대한 "http://simplejson.googlecode.com/svn/tags/simplejson-2.0.9/simplejson/tests/?hl=ko"에 대한 +1 단위 테스트를 실행할 가치가 있습니다. 약간의 모호한 경우 ". 유니 코드에 대해서도 좋은 점을 알 수 있습니다. 나는 그것이 나의 특정한 유스 케이스와 관련이 없다고 확신하지만, 그것은 내가 전에 고려하지 않았던 것이다. –

+1

흥미 롭; 나는 \ uXXXX 이스케이프 코드를 시도하고 작동하도록 맹세 할 수 있었다. 지금 테스트하면, 여기에 나온 것처럼 실패합니다. 나는 환각을 느꼈을 것임에 틀림 없다. ^.^ –

+1

또한 C speedups를 사용하는 경우 simplejson은 문자열 및 유니 코드의 혼합을 반환 할 수 있습니다.이 경우 유니 코드는 http://code.google.com/p/simplejson/issues를 수정하는 데 아무런 관심을 보이지 않는 것으로 보입니다./detail? id = 40 –

11

모범 사례의 요점은 대부분의 경우이를 무시하는 것이 좋습니다. 내가 너라면 JSON을 파이썬으로 파싱하기 위해 파서를 사용한다. simplejson을 시도해보십시오. 마지막으로 시도했을 때 JSON을 구문 분석하는 것은 매우 간단하며 Python 2.4와 호환 될 수 있다고 주장합니다.

Google에 대한 불만은 거의 없다고 생각합니다. 나는 그들을 불신하지 않을 것이지만, 나는 그들로부터 얻은 데이터를 검증 할 것입니다. 나는 실제로 JSON 파서를 사용하려는 이유는 귀하의 질문에 맞다 :

내 자신의 (짧은) 조사 JSON은 "/"탈출 순서를 제외하고, 파이썬 완전히 유효 발생하는 것이 좋습니다 - 어떤 GC가 생성되지 않는 것으로 보입니다.

Google 코드가 그런 이스케이프 시퀀스를 생성하지 않는다고 생각하는 이유는 무엇입니까?

올바른 도구를 사용하면 구문 분석이 문제가 해결됩니다. 이와 같은 단축키를 사용하려고하면 잘못된 가정에 의해 결국 물려 받게됩니다. 또는 선택한 언어에 대한 파서가 이미 존재할 때 정규식 및 부울 논리를 사용하여 파서를 해킹하려고하는 것과 같은 작업을 수행하게됩니다.

+0

호스트 된 환경에서 실행되지 않으면 아마도 simplejson을 사용하고있을 것입니다. 불행히도, 필자는 파이썬 환경에 대해 많은 통제권을 가지고 있지 않으며, 커스텀 패키지를 추가하는 방법을 배우는 것이 실제 스크립트를 작성하는 것보다 오래 걸릴 것이라고 생각합니다. 우리는 50 라인, 상판을 말하고 있습니다. 마찬가지로, GC가 해당 이스케이프 시퀀스를 생성하지 않는다는 것을 알지 못하지만, 그렇게한다면 스크립트는 자연스럽게 실패 할 것이고, 그것이 깨 졌음을 분명히 알 수 있으며 수정이 쉽습니다. –

+0

수정이 쉬운 경우 먼저 고정 방법을 사용하지 않으시겠습니까? –

+0

백 슬래시 계산에 정규식을 사용하기 때문에. 지금은 스크립트에 정규식이 없습니다. 가능한 경우 그대로 둡니다. :-) –

-1

eval JSON은 C++ 컴파일러를 통해 XML을 실행하는 것과 비슷합니다.

eval은 Python 코드를 평가하기위한 것입니다. 구문 상 유사점이 있지만 JSON은 파이썬 코드이 아닙니다. 지옥, 아니야 파이썬 코드, 그것은 코드로 시작하지 않습니다. 따라서 유스 케이스로 도망 갈 수 있다고해도 개념적으로는 좋지 않다고 생각합니다. 파이썬은 사과, JSON은 오렌지 맛 소다입니다. | JSON에서 부울 true 것을

+10

방금 ​​C++ 컴파일러를 통해 XML을 실행하고 컴파일 할 수 있는지 확인하게했습니다. 이런 템플릿. – Kiv

+2

흠 ... 방법이 있는지 궁금해? '재미있을거야. –

2

하나의 주요 차이점은 false,하지만 파이썬은 True | False.

이이 일반화 될 수 할 수없는 가장 중요한 이유 :이 임의의 코드 실행을 허용하기 때문에 eval 외부 입력을 해석하는 데 사용해서는 안됩니다.

관련 문제