PythonでJSONを解析する方法は?


281

私のプロジェクトは現在、PythonでJSONメッセージを受け取っており、情報を取得する必要があります。これを目的として、文字列内の単純なJSONに設定します。

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

これまではリストを使用してJSONリクエストを生成してきましたがjson.dumps、これと反対のことを行うには、使用する必要があると思いますjson.loads。しかし、私はそれにあまり運がありませんでした。上の例の"2"入力で返されるスニペットを誰かに提供してもらえ"two"ますか?


8
:ここに'単一引用符の文字列区切り文字を使用するデータが付属している場合、代わりに誤ってPython辞書の文字列表現を作成した可能性があります。JSONは常に"区切り文字を使用します。もしそうなら、その出力を使用するように生成し、修復あなたのコードjson.dumps()の代わりに、str()またはrepr()、として頭の上の辞書に辞書の文字列表現を変換しますか?Pythonデータを復元する方法を理解する。あなたがPythonリテラルを持っている他の手がかり?探しNoneTrueまたはFalse、JSONが使用するであろうnulltruefalse
Martijn Pieters

jsonStrが、(おそらくと辞書のリスト持っていない人':ここを見ても、単一引用符文字列の区切り文字を)stackoverflow.com/questions/41168558/...
ローレンツ

回答:


492

非常にシンプル:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

また、より良いパフォーマンスが必要な場合は、simplejsonをご覧ください。最近のバージョンでは、読み取りと書き込みを大幅に改善する最適化が提供されています。
unode

2
私は実際には既にsimplejsonを使用しています:import simplejson as json。言及するのを忘れましたが、感謝します:)
ingh.am

とった。.load代わりにメソッドを使用していた.loads
Sunil Kumar

85

jsonが文字列ではない場合があります。たとえば、次のようなURLからjsonを取得している場合:

j = urllib2.urlopen('http://site.com/data.json')

json.loadsではなく、json.loadを使用する必要があります。

j_obj = json.load(j)

(忘れがちです: 's'は 'string'です)


これを追加するだけで、j.read()を呼び出して文字列コンテンツを取得し、loadsメソッドを使用できます。この場合、何らかの方法でload()メソッドが.read()の呼び出しを処理します
rkachach

51

URLまたはファイルには、を使用しますjson.load()。.jsonコンテンツを含む文字列の場合は、を使用しますjson.loads()

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

以下はあなたに役立つかもしれない簡単な例です:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

上記のコードの出力は次のようになります。

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

dumpのident引数を設定して、次のように出力できることに注意してください(たとえば、print json.dumps(data、indent = 4)を使用する場合):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

jsonまたはast pythonモジュールのいずれかを使用できます。

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
ast.literal_eval()単純なテキストと整数のみの例を超えると問題が発生するため、JSON の関数を使用することはできません。JSONはPythonではありません。理由だけで、いくつかの JSONをして解析することができるast.literal_eval()適切なアプローチということはありません。
Martijn Pieters

1
たとえば、null、ブール値、および単一の非BMPコードポイントが含まれているため、r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'を使用して解析することはできませんast.literal_eval()。JSONは、Pythonリテラルがそれらを表す方法とは異なる方法でこれらの値を表します。json.loads()一方、その入力では問題がなく、正しくデコードすることに{'foo': None, 'bar': True, 'baz': '🤦'}
マルタインピータース

1
次に、ast.literal_eval()かなり遅く、カスタマイズできません。JSONのデコードに決して使用しないでください。
Martijn Pieters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.