Convertendo String JSON em Dicionário Não Listado


213

Estou tentando passar um arquivo JSON e converter os dados em um dicionário.

Até agora, foi o que eu fiz:

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

Eu espero json1_dataser um dicttipo, mas ele realmente sai como um listtipo quando eu verifico type(json1_data).

o que estou perdendo? Eu preciso que este seja um dicionário para que eu possa acessar uma das teclas.


3
Você pode nos mostrar um exemplo do seu arquivo JSON?
Mac

Estou tentando acessar a chave 'datapoints' graphite.sdsc.edu:8443/render/…
lawchit

4
Seu item base é uma lista. tente json1_data[0]['datapoints'].
Gddc

Em uma suposição eu diria seu JSON é uma lista não um dicionário
Joran Beasley

1
Pelo que nosso instrutor nos mostrou, quando ele digitou (json1_data), ele surgiu como um tipo de 'dict'. Obrigado pela ajuda a todos!
lawchit

Respostas:


276

Seu JSON é uma matriz com um único objeto, portanto, quando você o lê, obtém uma lista com um dicionário. Você pode acessar o seu dicionário acessando o item 0 na lista, como mostrado abaixo:

json1_data = json.loads(json1_str)[0]

Agora você pode acessar os dados armazenados no datapoints assim como você estava esperando:

datapoints = json1_data['datapoints']

Tenho mais uma pergunta, se alguém puder morder: estou tentando calcular a média dos primeiros elementos nesses pontos de dados (ou seja, pontos de dados [0] [0]). Apenas para listá-las, tentei fazer pontos de dados [0: 5] [0], mas tudo o que recebo é o primeiro ponto de dados com ambos os elementos, em vez de querer obter os primeiros 5 pontos de dados que contêm apenas o primeiro elemento. Existe uma maneira de fazer isso?

datapoints[0:5][0]não faz o que você está esperando. datapoints[0:5]retorna uma nova fatia da lista contendo apenas os 5 primeiros elementos e, em seguida, adicionar [0]no final dela pega apenas o primeiro elemento dessa fatia da lista resultante . O que você precisa usar para obter o resultado desejado é uma compreensão da lista :

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

Aqui está uma maneira simples de calcular a média:

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

Se você deseja instalar o NumPy , é ainda mais 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

O uso do ,operador com a sintaxe de fatiamento para matrizes de NumPy tem o comportamento que você esperava originalmente com as fatias da lista.


Obrigado por isso! Eu tenho mais uma pergunta, se alguém puder morder: estou tentando calcular a média dos primeiros elementos nesses pontos de dados (ou seja, pontos de dados [0] [0]). Apenas para listá-las, tentei fazer pontos de dados [0: 5] [0], mas tudo o que recebo é o primeiro ponto de dados com ambos os elementos, em vez de querer obter os primeiros 5 pontos de dados contendo apenas o primeiro elemento. Existe uma maneira de fazer isso?
lawchit

2
@lawchit - Veja minha resposta atualizada. Se você estiver fazendo contas com esses dados, eu recomendo usar o NumPy.
DaoWen 21/10

Este merece mais 100 pontos :-) Estou procurando esta solução há 1 dia inteiro
Mamun

16

Aqui está um trecho simples que lê em um jsonarquivo de texto de um dicionário. Observe que seu arquivo json deve seguir o padrão json, portanto, ele deve ter "aspas duplas em vez de 'aspas simples.

Seu arquivo JSON dump.txt:

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

Script Python:

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

8

Você pode usar o seguinte:

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

A melhor maneira de carregar dados JSON no dicionário é Você pode usar o carregador de json embutido.

Abaixo está o snippet de amostra que pode ser usado.

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

o comando 'open' fecha automaticamente o arquivo json nesse caso? Percebi que você não está usando um gerenciador de contexto.
Moondra

1
@Moondra U tem que usar o close () para fechar os arquivos
Sampat Kumar

2
@Moondra você também pode usar o with()operador em vez de ter de abrir e fechar o arquivo do site: with open("welcome.txt") as file: See: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Estou trabalhando com um código Python para uma API REST, então isso é para aqueles que estão trabalhando em projetos semelhantes.

Extraio dados de uma URL usando uma solicitação POST e a saída bruta é JSON. Por alguma razão, a saída já é um dicionário, não uma lista, e eu posso me referir às chaves de dicionário aninhadas imediatamente, assim:

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

onde datapoint_1 está dentro do dicionário de datapoints.


-1

passar os dados usando javascript ajax dos 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);
              }
            }
          }

visualizações 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
isso é uma resposta para a pergunta?
Siong Thye Goh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.