파이썬에서는 문자열을 구문 분석하기 전에 문자열이 유효한 JSON인지 확인하는 방법이 있습니까?
예를 들어 Facebook Graph API와 같은 작업을 수행하면 때로는 JSON을 반환하고 때로는 이미지 파일을 반환 할 수도 있습니다.
파이썬에서는 문자열을 구문 분석하기 전에 문자열이 유효한 JSON인지 확인하는 방법이 있습니까?
예를 들어 Facebook Graph API와 같은 작업을 수행하면 때로는 JSON을 반환하고 때로는 이미지 파일을 반환 할 수도 있습니다.
답변:
전달하는 문자열을 JSON으로 디코딩 할 수없는 json.loads()
경우을 시도 할 수 있습니다 ValueError
.
일반적으로 이런 종류의 상황에 대한 " Pythonic "철학을 EAFP 라고 하며 , 권한보다 용서를 구하기 가 더 쉽습니다 .
loads
except 절에서 전달한 문자열을 반환하면 무엇이 문제입니까 ?
10
유효한 JSON 숫자 값입니다.
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/
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, 인코딩, 디코딩 등의 기능을 수행 할 수 있습니다.
del json_object
한 번 검증 해야한다고 생각하십니까 ?
try
. #StopCanaryAbuse
파싱은 실제로 전적으로 말할 수있는 유일한 방법이라고 말할 것입니다. 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
except
조항은 심각한 예외를 숨길 수 있습니다. 예외 포착은 가능한 한 제한적이어야합니다.