486

I'm a little bit confused with JSON in Python. To me, it seems like a dictionary, and for that reason I'm trying to do that:

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

But when I do print(dict(json)), I get an error.

How can I transform this string into a structure and then call json["title"] to obtain "example glossary"?

0

4 Answers 4

851

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']
Sign up to request clarification or add additional context in comments.

6 Comments

What is the difference between json.load and json.loads ?
@ShivamAgrawal: Exactly what it says on the tin.
@ShivamAgrawal: The difference is that .load() parses a file object; .loads() parses a string / unicode object.
It bothers me that the author of this function did not write a wrapper function to perform a type check on the data being passed in to automatically choose the right function to call. I also do not like the vague nomenclature used. Here is what I wrote to combat this: 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) I'm sure this can be improved, but now you can call d = read_json(j) on a json 'str' or 'file'.
@JacquesMathieu, Hi Jacques, thanx for your function, I did a minor improvement since I sometimes use dictionaries: def read_json(json_data): if (type(json_data) == str): # For strings return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): #For files return json.load(json_data) elif (type(json_data) == dict): # For dictionaries return json.loads(json.dumps(json_data))
|
118

When I started using json, I was confused and unable to figure it out for some time, but finally I got what I wanted
Here is the simple solution

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

3 Comments

Why are you dumps(m) first?
I used it to demonstrate serialization and deserialization. Using loads(..) on '{"id": 2, "name": "hussain"}' should also be fine like the accepted answer.
dumps and loads works perfect for me, while the accepted answer isn't, thanks a lot @Hussain for saving me a time, FYI, I'm trying to loads from dynamic strings with utf-8 encoding...
25

If you trust the data source, you can use eval to convert your string into a dictionary:

eval(your_json_format_string)

Example:

>>> 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'>

6 Comments

The string in your example is not JSON.
True. It evals to a dictionary tho, which can easily be loaded/dumped as JSON (and of course you might need a custom json encoder function if your dictionary has none json values).
No. You should never evaluate input data as a code. This may be your little pet project that uses data you trust, but bad code can be reused and bad practices repeated in real projects, leaving a big security code.
And that's why my answer starts with "if you trust the data source"! But true, this is more of a hack, and definitely not the best practice.
You can totally trust the data source if it's your own. This is actually useful to convert a stringified JS object into a dic into a proper JSON string.
|
22

use simplejson or cjson for speedups

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.