Conversión de cadena JSON a diccionario no listado


215

Estoy tratando de pasar un archivo JSON y convertir los datos en un diccionario.

Hasta ahora, esto es lo que he hecho:

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

Espero json1_dataser un dicttipo, pero en realidad sale como un listtipo cuando lo reviso type(json1_data).

¿Qué me estoy perdiendo? Necesito que esto sea un diccionario para poder acceder a una de las claves.


3
¿Puede mostrarnos un ejemplo de su archivo JSON?
Mac

Estoy tratando de acceder a la clave de 'puntos de datos' graphite.sdsc.edu:8443/render/…
lawchit

44
Su artículo base es una lista. tratar json1_data[0]['datapoints'].
gddc

supongo que diría que su json es una lista, no un diccionario
Joran Beasley

1
Por lo que nuestro instructor nos mostró, cuando escribió (json1_data), apareció como un tipo 'dict'. ¡Gracias a todos por la ayuda!
lawchit

Respuestas:


277

Su JSON es una matriz con un solo objeto adentro, por lo que cuando lo lee, obtiene una lista con un diccionario adentro. Puede acceder a su diccionario accediendo al elemento 0 en la lista, como se muestra a continuación:

json1_data = json.loads(json1_str)[0]

Ahora puede acceder a los datos almacenados en los puntos de datos tal como esperaba:

datapoints = json1_data['datapoints']

Tengo una pregunta más si alguien puede morder: estoy tratando de tomar el promedio de los primeros elementos en estos puntos de datos (es decir, puntos de datos [0] [0]). Solo para enumerarlos, intenté hacer puntos de datos [0: 5] [0] pero todo lo que obtengo es el primer punto de datos con ambos elementos en lugar de querer obtener los primeros 5 puntos de datos que contienen solo el primer elemento. ¿Hay alguna forma de hacer esto?

datapoints[0:5][0]no hace lo que esperas. datapoints[0:5]devuelve un nuevo segmento de lista que contiene solo los primeros 5 elementos, y luego agregar [0]al final tomará solo el primer elemento de ese segmento de lista resultante . Lo que necesita usar para obtener el resultado que desea es una comprensión de la lista :

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

Aquí hay una manera simple de calcular la media:

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

Si está dispuesto a instalar NumPy , entonces es aún más fácil:

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

El uso del ,operador con la sintaxis de segmentación para las matrices de NumPy tiene el comportamiento que originalmente esperaba con los sectores de la lista.


¡Gracias por esto! Tengo una pregunta más si alguien puede morder: estoy tratando de tomar el promedio de los primeros elementos en estos puntos de datos (es decir, puntos de datos [0] [0]). Solo para enumerarlos, intenté hacer puntos de datos [0: 5] [0] pero todo lo que obtengo es el primer punto de datos con ambos elementos en lugar de querer obtener los primeros 5 puntos de datos que contienen solo el primer elemento. ¿Hay alguna forma de hacer esto?
lawchit

2
@lawchit - Vea mi respuesta actualizada. Si vas a hacer cálculos matemáticos con estos datos, te recomiendo usar NumPy.
DaoWen

Este merece otros 100 puntos :-) He estado buscando esta solución durante 1 día completo
Mamun

16

Aquí hay un fragmento simple que se lee en un jsonarchivo de texto de un diccionario. Tenga en cuenta que su archivo json debe seguir el estándar json, por lo que debe tener "comillas dobles en lugar de 'comillas simples.

Su archivo JSON dump.txt:

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

Python Script:

import json
with open('/your/path/to/a/dict/dump.txt') as handle:
    dictdump = json.loads(handle.read())

8

Puedes usar lo siguiente:

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"])

3

La mejor manera de cargar datos JSON en el diccionario es usar el cargador json incorporado.

A continuación se muestra el fragmento de muestra que se puede utilizar.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])

¿el comando 'abrir' cierra automáticamente el archivo json en este caso? Me di cuenta de que no estás usando un administrador de contexto.
Moondra

1
@Moondra U tiene que usar close () para cerrar los archivos
Sampat Kumar

2
@Moondra también podría usar el with()operador en lugar de tener que abrir y cerrar el archivo Desde el sitio: with open("welcome.txt") as file: Consulte: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Estoy trabajando con un código de Python para una API REST, por lo que es para aquellos que trabajan en proyectos similares.

Extraigo datos de una URL usando una solicitud POST y la salida sin formato es JSON. Por alguna razón, el resultado ya es un diccionario, no una lista, y puedo referirme a las teclas de diccionario anidadas de inmediato, así:

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

donde datapoint_1 está dentro del diccionario de puntos de datos.


-1

pasar los datos usando javascript ajax desde métodos get

    **//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);
              }
            }
          }

vistas de django

    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.")**

2
¿Es esta una respuesta a la pregunta?
Siong Thye Goh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.