Chuyển đổi chuỗi JSON thành dict bằng Python


415

Tôi hơi bối rối với JSON trong Python. Đối với tôi, nó có vẻ giống như một cuốn từ điển và vì lý do đó, tôi đang cố gắng làm điều đó:

{
    "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"
                }
            }
        }
    }
}

Nhưng khi tôi làm print dict(json), nó đưa ra một lỗi.

Làm thế nào tôi có thể chuyển đổi chuỗi này thành một cấu trúc và sau đó gọi json["title"]để có được "bảng chú giải ví dụ"?

Câu trả lời:


756

json.loads()

import json

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

9
Sự khác biệt giữa json.load và json.loads là gì?
Shivam Agrawal

5
@ShivamAgrawal: Chính xác những gì nó nói trên tin .
Ignacio Vazquez-Abrams

64
@ShivamAgrawal: Sự khác biệt là .load()phân tích cú pháp một đối tượng tệp; .loads()phân tích một đối tượng chuỗi / unicode.
fyngyrz

1
Điều đó làm phiền tôi rằng tác giả của chức năng này đã không viết hàm bao bọc để thực hiện kiểm tra kiểu trên dữ liệu được truyền vào để tự động chọn đúng chức năng cần gọi. Tôi cũng không thích danh pháp mơ hồ được sử dụng. Đây là những gì tôi đã viết để chống lại điều này: 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) Tôi chắc chắn rằng điều này có thể được cải thiện, nhưng bây giờ bạn có thể gọi d = read_json(j)một tập tin json 'str' hoặc 'tập tin'.
Jacques Mathieu

2
@JacquesMathieu, Hi Jacques, thanx cho chức năng của bạn, tôi đã cải thiện một chút vì đôi khi tôi sử dụng từ điển: def read_json (json_data): if (type (json_data) == str): # Đối với chuỗi trả về json.loads (json_data) (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): #For tệp trả về json.load (json_data) elif (type (json_data) == dict): # Dành cho từ điển trả về json.loads (json.dumps (json_data))
Gabriel Aizcorbe

98

Khi tôi bắt đầu sử dụng json, tôi đã bối rối và không thể tìm ra nó trong một thời gian, nhưng cuối cùng tôi đã có được điều tôi muốn
Đây là giải pháp đơn giản

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

Tại sao bạn lại bỏ (m) trước?
Han Van Phạm

Tôi đã sử dụng nó để chứng minh tuần tự hóa và giải tuần tự hóa. Sử dụng loads(..)trên '{"id": 2, "name": "hussain"}'cũng nên tốt như câu trả lời được chấp nhận.
Hussain

1
Các bãi chứa và tải hoạt động hoàn hảo đối với tôi, trong khi câu trả lời được chấp nhận thì không, cảm ơn rất nhiều @Hussain đã cứu tôi time, FYI, tôi đang cố gắng loadstừ các chuỗi động với mã hóa utf-8 ...
Mohammed Sufian

19

sử dụng Simplejson hoặc cjson để tăng tốc

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

Nếu bạn tin tưởng nguồn dữ liệu, bạn có thể sử dụng evalđể chuyển đổi chuỗi của mình thành từ điển:

eval(your_json_format_string)

Thí dụ:

>>> 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
Chuỗi trong ví dụ của bạn không phải là JSON.
bfontaine

1
Thật. Nó phát triển thành một từ điển tho, có thể dễ dàng được tải / kết xuất dưới dạng JSON (và tất nhiên bạn có thể cần một hàm mã hóa json tùy chỉnh nếu từ điển của bạn không có giá trị json).
kakhkAtion

3
Không. Bạn không bao giờ nên đánh giá dữ liệu đầu vào dưới dạng mã. Đây có thể là dự án thú cưng nhỏ của bạn sử dụng dữ liệu mà bạn tin tưởng, nhưng mã xấu có thể được sử dụng lại và các thực tiễn xấu được lặp lại trong các dự án thực, để lại một mã bảo mật lớn.
NetworkMeister

Và đó là lý do tại sao câu trả lời của tôi bắt đầu bằng "nếu bạn tin tưởng nguồn dữ liệu"! Nhưng sự thật, đây là một hack nhiều hơn, và chắc chắn không phải là thực tiễn tốt nhất.
kakhkAtion

Bạn hoàn toàn có thể tin tưởng vào nguồn dữ liệu nếu đó là của riêng bạn. Điều này thực sự hữu ích để chuyển đổi một đối tượng JS được xâu chuỗi thành một dic thành một chuỗi JSON thích hợp.
Vadorequest
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.