289

I am trying to pass in a JSON file and convert the data into a dictionary.

So far, this is what I have done:

import json
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)

I'm expecting json1_data to be a dict type but it actually comes out as a list type when I check it with type(json1_data).

What am I missing? I need this to be a dictionary so I can access one of the keys.

Braiam
  • 1
  • 11
  • 47
  • 78
lawchit
  • 3,043
  • 2
  • 13
  • 9
  • 5
    Can you show us an example of your JSON file? – Mac Oct 20 '13 at 21:58
  • I am trying to access the 'datapoints' key https://graphite.sdsc.edu:8443/render/?width=586&height=308&_salt=1382133442.942&target=hosts.SDSC_CI.swift-storage-2-1_sdsc_edu.diskstat_sde_writes&format=json – lawchit Oct 20 '13 at 22:03
  • 5
    Your base item is a list. try `json1_data[0]['datapoints']`. – g.d.d.c Oct 20 '13 at 22:05
  • at a guess I would say your json is a list not a dictionary – Joran Beasley Oct 20 '13 at 22:05
  • 2
    From what our instructor showed us, when he did type(json1_data) his came up as a 'dict' type. Thank you for the help everyone! – lawchit Oct 20 '13 at 22:11

6 Answers6

353

Your JSON is an array with a single object inside, so when you read it in you get a list with a dictionary inside. You can access your dictionary by accessing item 0 in the list, as shown below:

json1_data = json.loads(json1_str)[0]

Now you can access the data stored in datapoints just as you were expecting:

datapoints = json1_data['datapoints']

I have one more question if anyone can bite: I am trying to take the average of the first elements in these datapoints(i.e. datapoints[0][0]). Just to list them, I tried doing datapoints[0:5][0] but all I get is the first datapoint with both elements as opposed to wanting to get the first 5 datapoints containing only the first element. Is there a way to do this?

datapoints[0:5][0] doesn't do what you're expecting. datapoints[0:5] returns a new list slice containing just the first 5 elements, and then adding [0] on the end of it will take just the first element from that resulting list slice. What you need to use to get the result you want is a list comprehension:

[p[0] for p in datapoints[0:5]]

Here's a simple way to calculate the mean:

sum(p[0] for p in datapoints[0:5])/5. # Result is 35.8

If you're willing to install NumPy, then it's even easier:

import numpy
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)[0]
datapoints = numpy.array(json1_data['datapoints'])
avg = datapoints[0:5,0].mean()
# avg is now 35.8

Using the , operator with the slicing syntax for NumPy's arrays has the behavior you were originally expecting with the list slices.

Praetorian
  • 106,671
  • 19
  • 240
  • 328
DaoWen
  • 32,589
  • 6
  • 74
  • 101
  • Thank you for this! I have one more question if anyone can bite: I am trying to take the average of the first elements in these datapoints(i.e. datapoints[0][0]). Just to list them, I tried doing datapoints[0:5][0] but all I get is the first datapoint with both elements as opposed to wanting to get the first 5 datapoints containing only the first element. Is there a way to do this? – lawchit Oct 20 '13 at 22:40
  • 2
    @lawchit - See my updated answer. If you're going to be doing math with this data I'd highly recommend using NumPy. – DaoWen Oct 21 '13 at 00:35
  • This one deserves another 100 points :-) I have been looking for this solution for 1 full day – Mamun Feb 04 '20 at 19:22
  • I wasted hours in figuring out why my read json data is so much mess. This answer saved me. Thanks for sharing. – Raymond Feb 01 '22 at 17:52
28

Here is a simple snippet that read's in a json text file from a dictionary. Note that your json file must follow the json standard, so it has to have " double quotes rather then ' single quotes.

Your JSON dump.txt File:

{"test":"1", "test2":123}

Python Script:

import json
with open('/your/path/to/a/dict/dump.txt') as handle:
    dictdump = json.loads(handle.read())
user1767754
  • 23,311
  • 18
  • 141
  • 164
17

You can use the following:

import json

 with open('<yourFile>.json', 'r') as JSON:
       json_dict = json.load(JSON)

 # Now you can use it like dictionary
 # For example:

 print(json_dict["username"])
raviTeja
  • 338
  • 1
  • 7
  • 21
userguest
  • 171
  • 1
  • 2
3

The best way to Load JSON Data into Dictionary is You can user the inbuilt json loader.

Below is the sample snippet that can be used.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])
Dekel Pilli
  • 3
  • 1
  • 2
Sampat Kumar
  • 492
  • 1
  • 6
  • 14
  • does the 'open' command automatically close the json file in this case? I've noticed you are not using a context manager. – Moondra May 03 '18 at 18:36
  • 1
    @Moondra U have to use the close() to close the files – Sampat Kumar May 08 '18 at 10:47
  • 2
    @Moondra you could also use the `with()` operator instead of having to open and close the file From the site: `with open("welcome.txt") as file:` See: https://www.pythonforbeginners.com/files/with-statement-in-python – Aceofspadez44 Sep 22 '18 at 13:30
1

I am working with a Python code for a REST API, so this is for those who are working on similar projects.

I extract data from an URL using a POST request and the raw output is JSON. For some reason the output is already a dictionary, not a list, and I'm able to refer to the nested dictionary keys right away, like this:

datapoint_1 = json1_data['datapoints']['datapoint_1']

where datapoint_1 is inside the datapoints dictionary.

jeppoo1
  • 650
  • 1
  • 10
  • 23
-2

pass the data using javascript ajax from get methods

    **//javascript function    
    function addnewcustomer(){ 
    //This function run when button click
    //get the value from input box using getElementById
            var new_cust_name = document.getElementById("new_customer").value;
            var new_cust_cont = document.getElementById("new_contact_number").value;
            var new_cust_email = document.getElementById("new_email").value;
            var new_cust_gender = document.getElementById("new_gender").value;
            var new_cust_cityname = document.getElementById("new_cityname").value;
            var new_cust_pincode = document.getElementById("new_pincode").value;
            var new_cust_state = document.getElementById("new_state").value;
            var new_cust_contry = document.getElementById("new_contry").value;
    //create json or if we know python that is call dictionary.        
    var data = {"cust_name":new_cust_name, "cust_cont":new_cust_cont, "cust_email":new_cust_email, "cust_gender":new_cust_gender, "cust_cityname":new_cust_cityname, "cust_pincode":new_cust_pincode, "cust_state":new_cust_state, "cust_contry":new_cust_contry};
    //apply stringfy method on json
            data = JSON.stringify(data);
    //insert data into database using javascript ajax
            var send_data = new XMLHttpRequest();
            send_data.open("GET", "http://localhost:8000/invoice_system/addnewcustomer/?customerinfo="+data,true);
            send_data.send();

            send_data.onreadystatechange = function(){
              if(send_data.readyState==4 && send_data.status==200){
                alert(send_data.responseText);
              }
            }
          }

django views

    def addNewCustomer(request):
    #if method is get then condition is true and controller check the further line
        if request.method == "GET":
    #this line catch the json from the javascript ajax.
            cust_info = request.GET.get("customerinfo")
    #fill the value in variable which is coming from ajax.
    #it is a json so first we will get the value from using json.loads method.
    #cust_name is a key which is pass by javascript json. 
    #as we know json is a key value pair. the cust_name is a key which pass by javascript json
            cust_name = json.loads(cust_info)['cust_name']
            cust_cont = json.loads(cust_info)['cust_cont']
            cust_email = json.loads(cust_info)['cust_email']
            cust_gender = json.loads(cust_info)['cust_gender']
            cust_cityname = json.loads(cust_info)['cust_cityname']
            cust_pincode = json.loads(cust_info)['cust_pincode']
            cust_state = json.loads(cust_info)['cust_state']
            cust_contry = json.loads(cust_info)['cust_contry']
    #it print the value of cust_name variable on server
            print(cust_name)
            print(cust_cont)
            print(cust_email)
            print(cust_gender)
            print(cust_cityname)
            print(cust_pincode)
            print(cust_state)
            print(cust_contry)
            return HttpResponse("Yes I am reach here.")**
DanielM
  • 3,598
  • 5
  • 37
  • 53