PythonはJsonデータを処理する

18715 ワード

JSON(JavaScript Object Notation)は、軽量レベルのデータ交換フォーマットです.読みやすく、書きやすい.同時に機械の解析と生成も容易である.本文はPythonの中の関連する操作を簡単に紹介して、原文はPythonがJsonデータを処理することを参照します.
データフォーマットは、キー値ペアの集合(A collection of name/value pairs)と簡単に理解できる.異なる言語では、オブジェクト(object)、レコード(record)、構造(struct)、辞書(dictionary)、ハッシュテーブル(hash table)、キーリスト(keyed list)、または関連配列(associative array)として理解されます.値には、シーケンステーブル(An ordered list of values)があります.ほとんどの言語では、配列(array)として理解されています.
import json

PyhtonのJsonモジュールは、メモリ内のオブジェクトをシーケンス化する方法を提供します.json.dumps dumpの機能はPythonオブジェクトencodeをjsonオブジェクトとし、符号化プロセスである.注意jsonモジュールはjson.dumpsjson.dumpの方法を提供し、違いはdumpが直接ファイルに到着することであり、dumpsが文字列に到着することであり、ここでのsstringと理解される.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

data_string = json.dumps(data)
print 'JSON:', data_string
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]

タイプを確認すると、stringオブジェクトが見つかります.
print type(data)
print type(data_string)


json.dump Pythonオブジェクトをstringに符号化するだけでなく、ファイルに書き込むこともできます.Pythonオブジェクトを直接ファイルに書き込むことができないため、TypeError: expected a string or other character buffer objectをエラーとして報告し、シーケンス化する必要があります.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
with open('output.json','w') as fp:
    json.dump(data,fp)
cat output.json
[{"a": "A", "c": 3.0, "b": [2, 4]}]
json.loads Python内蔵オブジェクトdumpからjsonオブジェクトへの操作方法を知っています.では、jsonオブジェクトdecodeからPython識別可能なオブジェクトへの復号方法を知っていますか.はい、json.loadsメソッドを使用します.もちろん、これはstringに基づいています.ファイルであれば、json.loadメソッドを使用することができます.
decoded_json = json.loads(data_string)
#      ,  list
print type(decoded_json)

#     data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]  
print decoded_json[0]['a']
A
json.load
直接loadファイルを使用できます.
with open('output.json') as fp:
    print type(fp)
    loaded_json = json.load(fp)

#      ,  list
print type(decoded_json)

#     data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]  
print decoded_json[0]['a']
A

データ型対応jsonおよびPythonオブジェクト変換中、データ型が完全に一致せず、対応する.
Python
Json
dict
object
list,tuple
array
str, unicode
string
int,long,float
number
True
true
False
false
None
null json.dumps共通パラメータ
いくつかのパラメータは、出力をよりよく制御することができます.よく見られるのは、sort_keys,indent,separators,skipkeysなどである.sort_keys名前はよくわかりますが、出力時に辞書はランダムではなくボタン値でソートされます.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

unsorted = json.dumps(data)
print 'JSON:', json.dumps(data)
print 'SORT:', json.dumps(data, sort_keys=True)
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
JSON: [{"a": "A", "c": 3.0, "b": [2, 4]}]
SORT: [{"a": "A", "b": [2, 4], "c": 3.0}]
indentは、よりインデントされ、構造をよりよく見ることができます.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)

print 'NORMAL:', json.dumps(data, sort_keys=True)
print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
NORMAL: [{"a": "A", "b": [2, 4], "c": 3.0}]
INDENT: [
  {
    "a": "A", 
    "b": [
      2, 
      4
    ], 
    "c": 3.0
  }
]
separatorsは区切り記号を提供し、白いスペースを出すことができ、出力がよりコンパクトで、データがより小さい.デフォルトの区切り文字は(', ', ': ')で、白いスペースがあります.異なるdumpsパラメータは、対応するファイルのサイズが一目瞭然です.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0 } ]
print 'DATA:', repr(data)
print 'repr(data)             :', len(repr(data))
print 'dumps(data)            :', len(json.dumps(data))
print 'dumps(data, indent=2)  :', len(json.dumps(data, indent=2))
print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')))
DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}]
repr(data)             : 35
dumps(data)            : 35
dumps(data, indent=2)  : 76
dumps(data, separators): 29
json辞書が必要なキーは文字列です.そうしないとValueErrorが投げ出されます.
data = [ { 'a':'A', 'b':(2, 4), 'c':3.0, ('d',):'D tuple' } ]

print 'First attempt'
try:
    print json.dumps(data)
except (TypeError, ValueError) as err:
    print 'ERROR:', err

print
print 'Second attempt'
print json.dumps(data, skipkeys=True)
First attempt
ERROR: keys must be a string

Second attempt
[{"a": "A", "c": 3.0, "b": [2, 4]}]