Pythonで、文字列を解析する前に有効なJSONかどうかを確認する方法はありますか?
たとえば、Facebook Graph APIのようなものを操作する場合、JSONを返すこともあれば、画像ファイルを返すこともあります。
Pythonで、文字列を解析する前に有効なJSONかどうかを確認する方法はありますか?
たとえば、Facebook Graph APIのようなものを操作する場合、JSONを返すこともあれば、画像ファイルを返すこともあります。
回答:
あなたがしようとすることができますjson.loads()
、それはValueError
あなたが渡す文字列がJSONとしてデコードできない場合にスローします。
一般的に、この種の状況に対する「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]
PythonオブジェクトをJSON文字列に変換します。
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
低レベルの解析にアクセスしたい場合は、独自のロールを行わず、既存のライブラリを使用してください:http : //www.json.org/
Python 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
構文チェック、構文解析、暗号化、エンコード、デコードなどが可能です。
del json_object
一度検証する必要があると思いますか?
try
。#StopCanaryAbuse
それを解析することがあなたが本当に完全に言うことができる唯一の方法だと私は言うでしょう。json.loads()
正しい形式でない場合、Pythonの関数によって例外が発生します(ほぼ間違いなく)。ただし、例の目的では、おそらく空白以外の文字の最初の2組だけを確認できます...
私はFacebookが送り返すことをJSONに慣れていないんだけど、Webアプリケーションから最もJSON文字列は、オープン正方形の始まります[
かカーリー{
ブラケット。私が知っている画像フォーマットは、それらの文字で始まりません。
逆に、表示される画像フォーマットがわかっている場合は、文字列の先頭の署名をチェックして画像を識別し、画像でない場合はJSONであると想定できます。
テキスト文字列ではなくグラフィックを特定するためのもう1つの簡単なハックは、グラフィックを探している場合に、文字列の最初の数十文字の非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
条項は重大な例外を隠す可能性があります。例外のキャッチはできるだけ制限的でなければなりません。