\r\n\r\n
JSON(JavaScript Object Representationの略)とは、異なるアプリケーション間のデータ交換を容易にするテキストベースのフォーマットです。例えば、Windows上で動作するC++で書かれたアプリケーションと、Linux上で動作するPythonで書かれたアプリケーションでは、JSONデータを簡単に実行することができます。そのシンプルさと柔軟性により、特に初期のXMLベースのフォーマットと比較して、近年広く採用されている。
ほとんどすべての言語と環境からJSONをパースして生成するためのライブラリやツールキットが利用できます。この記事では、pythonを使ってJSONを処理する際に発生する方法と問題点に焦点を当てます。
最も一般的なJSONの実体はオブジェクトであり、以下のような形式のキーと値のマッピングのセットです。
Personal.json。
{ "firstName": "Alice", "lastName": "Hall", "age": 35}ここでは、オブジェクトの配列を表現する方法を説明します。この表現では、配列の各項目がオブジェクトになります。ここでは、野球選手の年俸のサンプルを示します。
Wages.json。
[ { "year" : 1985, "teamId" : "ATL", "leagueId" : "NL", "playerId" : "barkele01", "salary" : 870000}, { "year" : 1985, "teamId" : "ATL", "leagueId" : "NL", "playerId" : "bedrost01", "salary" : 550000} ]もちろん、次のようなスカラー配列の表現も可能である。
[ "hello", "world", 35]Pythonはjsonモジュールを提供しており、jsonをパースしたり、Pythonのオブジェクトやリストからjsonを生成するのに利用することができます。
次のコードは、JSONファイルを開き、データを変数にロードする方法を示しています。
import jsonwith open('sample.json', 'r') as fp: obj = json.load(fp)JSONデータを含む文字列がある場合、以下のコマンドでpythonオブジェクト(またはリスト)に変換することができます。
obj = json.loads("""{ "firstName": "Alice", "lastName": "Hall", "age": 35}""")JSON URLをパースするには、従来通りurllib2を使ってURLオブジェクトを作成し、json.loadファイル()を使用すればよい。
import urllib2, jsonurl = urllib2.urlopen('http://site.com/sample.json')obj = json.load(url)JSONにエラーがある場合はValueErrorを取得します。必要に応じて対処し、修正することができます。
try: obj = json.loads("""{ "firstName": "Alice", "lastName: "Hall", "age": 35 }""")except ValueError: print "error loading JSON"Pythonのコマンドラインを使ってJSONをパースするのは、エラーをチェックしたり、インデントされた良い出力を得たりするのに便利な場合があります。
cat glossary.json# prints{"glossary": {"GlossDiv": {"GlossList": {"GlossEntry": {"GlossDef": {"GlossSeeAlso": ["GML", "XML"], "para": "A meta-markup language, used to create markup languages such as DocBook."}, "GlossSee": "markup", "Acronym": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Abbrev": "ISO 8879:1986", "SortAs": "SGML", "ID": "SGML"}}, "title": "S"}, "title": "example glossary"}}上記のJSONファイルからインデントされた出力を得るには、以下のようにします。
python -mjson.tool glossary.json# prints{ "glossary": { "GlossDiv": { "GlossList": { "GlossEntry": { "Abbrev": "ISO 8879:1986", "Acronym": "SGML", "GlossDef": { "GlossSeeAlso": [ "GML", "XML" ], "para": "A meta-markup language, used to create markup languages such as DocBook." }, "GlossSee": "markup", "GlossTerm": "Standard Generalized Markup Language", "ID": "SGML", "SortAs": "SGML" } }, "title": "S" }, "title": "example glossary" }}ここでは、JSONオブジェクトをpythonに読み込み、必要な内容のみを抽出する方法を紹介します。
python -c 'import json; fp = open("glossary.json", "r"); obj = json.load(fp); fp.close(); print obj["glossary"]["title"]'# printsexample glossaryJSONデータがpython変数に読み込まれると、そのデータはpythonのdict(場合によってはリスト)のようにアクセスすることができるようになります。例えば、上記のJSONデータには、以下のようにアクセスすることができます。
firstName = obj["firstName"]lastName = obj["Hall"]age = obj["age"]データ型はデータから自動的に決定される。年齢が整数として解析されることに注意。
print type(obj["firstName"]), type(obj["lastName"]), type(obj["age"])# prints<type 'unicode'> <type 'unicode'> <type 'int'>JSONからpythonへの変換は、以下の変換テーブルを使用します。
デフォルトでは、JSONオブジェクトはpythonのdictとしてパースされます。時には、JSONデータから独自のクラスのオブジェクトを自動的に作成する必要があるかもしれません。これは、変換を処理するobjectuフック関数を指定することで可能である。次の例では、その方法を示しています。
個人を表すカスタムクラスです。
class Person: def __init__(self, firstName, lastName, age): self.firstName = firstName self.lastName = lastName self.age = age def __str__(self): return '{{"firstName" = "{0}","lastName" = "{1}", "age" = {2}}}'.format(self.firstName, self.lastName, self.age)これらのインスタンスは、以下のように必要なパラメータを渡すことで生成される。
person = Person("Crystal", "Newell", 27)JSONをパースする際にこのクラスを使ってインスタンスを生成するには、次のように定義されたobject\uフック関数が必要です。この関数はpython dictを受け取り、正しいクラスのオブジェクトを返します。
def obj_creator(d): return Person(d['firstName'], d['lastName'], d['age'])JSONパーサーを呼び出す際に、このobjectuフック関数が使用できるようになりました。
with open('sample.json', 'r') as fp: obj = json.load(fp, object_hook = obj_creator)print obj# prints{"firstName" = "Alice","lastName" = "Hall", "age" = 35}JSONは今、とても人気があります。多くのWebサイトやSaaS(Software as a Service)アプリケーションは、アプリケーションが直接使用できるJSON出力を提供しています。公開されている情報の一部をご紹介します。
Pythonの最適な使い方の例をもっと知りたい方は、Pythonを使ったソーシャルメディアボットの構築ガイドをご覧ください。
JSONを使用してサービスを利用または提供していますか?また、技術スタックでPythonを使用していますか?