Pythonを使用してJSON文字列をdictに変換する


415

PythonのJSONとは少し混乱しています。私には、それは辞書のように見えます。そのため、私はそれを試みています。

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

しかし、私がするときprint dict(json)、それはエラーを出します。

この文字列を構造に変換して、json["title"]「サンプル用語集」を取得するために呼び出すにはどうすればよいですか?

回答:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
json.loadとjson.loadsの違いは何ですか?
Shivam Agrawal

5
@ShivamAgrawal:それがまさに缶に何を言っているか。
Ignacio Vazquez-Abrams

64
@ShivamAgrawal:違いは.load()、ファイルオブジェクトを解析することです。.loads()文字列/ Unicodeオブジェクトを解析します。
fyngyrz 2016

1
この関数の作成者が、渡されるデータの型チェックを実行して、呼び出す適切な関数を自動的に選択するラッパー関数を作成していなかったことに悩みました。また、漠然とした命名法が嫌いです。これを戦うために私が書いたものは次のとおり def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) です。これは改善できると確信していますがd = read_json(j)、jsonの「str」または「file」を呼び出すことができます。
ジャックマチュー

2
@JacquesMathieu、こんにちは、あなたの関数に感謝します。辞書を時々使用するので、少し改善しました:def read_json(json_data):if(type(json_data)== str):#文字列の場合はjson.loads(json_data)elifを返します(str(type(json_data))== "<class '_io.TextIOWrapper'>"):#ファイルの場合はjson.load(json_data)を返しますelif(type(json_data)== dict):#辞書の場合はjson.loadsを返します(json.dumps(json_data))
Gabriel Aizcorbe

98

私がjsonを使い始めたとき、私は混乱してしばらくの間それを理解することができませんでしたが、最終的に私は欲しいものを得ましたこれ
は簡単な解決策です

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

なぜ最初にダンプするのですか?
Han Van Pham

シリアル化と逆シリアル化のデモに使用しました。loads(..)onの使用'{"id": 2, "name": "hussain"}'も、受け入れられた回答のように問題ないはずです。
フセイン2018

1
ダンプとロードは私にとって完璧に機能しますが、受け入れられた回答はそうではありません。@ Fussainを保存してくれてありがとうtime、FYI、私はloadsutf-8エンコーディングの動的文字列からしようとしています...
Mohammed Sufian

19

高速化にはsimplejsonまたはcjsonを使用します

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

データソースを信頼できる場合は、を使用evalして文字列を辞書に変換できます。

eval(your_json_format_string)

例:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
この例の文字列はJSONではありません。
bfontaine

1
そうだね。これは、JSONとして簡単にロード/ダンプできるディクショナリに評価されます(もちろん、ディクショナリにjson値がない場合は、カスタムjsonエンコーダー関数が必要になる場合があります)。
kakhkAtion

3
いいえ。入力データをコードとして評価しないでください。これは信頼できるデータを使用する小さなペットプロジェクトかもしれませんが、不正なコードが再利用され、実際のプロジェクトで不正行為が繰り返され、大きなセキュリティコードが残る可能性があります。
NetworkMeister 2018年

そして、それが私の答えが「あなたがデータソースを信頼するなら」から始まる理由です!しかし、本当のことですが、これはよりハックであり、間違いなくベストプラクティスではありません。
kakhkAtion

データソースが独自のものである場合は、完全に信頼できます。これは、文字列化されたJSオブジェクトをdicに変換して適切なJSON文字列に変換するのに実際に役立ちます。
Vadorequest
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.