[python] 파이썬에서 문자열이 유효한 JSON인지 어떻게 확인합니까?

파이썬에서는 문자열을 구문 분석하기 전에 문자열이 유효한 JSON인지 확인하는 방법이 있습니까?

예를 들어 Facebook Graph API와 같은 작업을 수행하면 때로는 JSON을 반환하고 때로는 이미지 파일을 반환 할 수도 있습니다.



답변

전달하는 문자열을 JSON으로 디코딩 할 수없는 json.loads()경우을 시도 할 수 있습니다 ValueError.

일반적으로 이런 종류의 상황에 대한 ” Pythonic “철학을 EAFP 라고 하며 , 권한보다 용서를 구하기더 쉽습니다 .


답변

문자열이 유효한 json 인 경우 Python 스크립트 예제는 부울을 리턴합니다.

import json

def is_json(myjson):
  try:
    json_object = json.loads(myjson)
  except ValueError as e:
    return False
  return True

어떤 지문 :

print is_json("{}")                          #prints True
print is_json("{asdf}")                      #prints False
print is_json('{ "age":100}')                #prints True
print is_json("{'age':100 }")                #prints False
print is_json("{\"age\":100 }")              #prints True
print is_json('{"age":100 }')                #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True

JSON 문자열을 Python 사전으로 변환하십시오.

import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo'])    #prints bar

mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]

파이썬 객체를 JSON 문자열로 변환하십시오.

foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo))           #prints {"gummy": "bear"}

저수준 파싱에 액세스하려면 직접 굴리지 말고 기존 라이브러리를 사용하십시오. 하십시오 http://www.json.org/

파이썬 JSON 모듈에 대한 훌륭한 튜토리얼 : https://pymotw.com/2/json/

문자열 JSON이며 구문 오류 및 오류 메시지를 표시합니다.

sudo cpan JSON::XS
echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json
json_xs -t none < myjson.json

인쇄물:

, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.

json_xs 구문 검사, 구문 분석, prittifying, 인코딩, 디코딩 등의 기능을 수행 할 수 있습니다.

https://metacpan.org/pod/json_xs


답변

파싱은 실제로 전적으로 말할 수있는 유일한 방법이라고 말할 것입니다. json.loads()올바른 형식이 아닌 경우 파이썬 기능에 의해 예외가 발생 합니다 (거의 확실합니다). 그러나 예제의 목적은 아마도 공백이 아닌 첫 문자 몇 개만 확인할 수 있습니다.

페이스 북이 다시 보내는 JSON에 익숙하지 않지만 웹 앱의 대부분의 JSON 문자열은 열린 사각형 [또는 중괄호로 시작 {합니다. 해당 문자로 시작하는 이미지 형식이 없습니다.

반대로 어떤 이미지 형식이 표시 될 수 있는지 알고있는 경우 문자열의 서명에서 서명을 확인하여 이미지를 식별하고 이미지가 아닌 경우 JSON이 있다고 가정 할 수 있습니다.

텍스트 문자열이 아닌 그래픽을 식별하는 또 다른 간단한 해킹은 그래픽을 찾고있는 경우 문자열의 첫 두 자릿수에서 ASCII가 아닌 문자를 테스트하는 것입니다 (JSON이 ASCII라고 가정) ).


답변

이 문제에 대한 일반적이고 흥미로운 해결책을 찾았습니다.

class SafeInvocator(object):
    def __init__(self, module):
        self._module = module

    def _safe(self, func):
        def inner(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except:
                return None

        return inner

    def __getattr__(self, item):
        obj = getattr(self.module, item)
        return self._safe(obj) if hasattr(obj, '__call__') else obj

다음과 같이 사용할 수 있습니다.

safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
    # do something


답변