Перетворення рядка JSON в словник не в списку


215

Я намагаюся передати файл JSON і перетворити дані у словник.

Поки що це я зробив:

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

Я сподіваюся json1_dataбути dictтипом, але він фактично виходить як listтип, коли я перевіряю його type(json1_data).

Що я пропускаю? Мені потрібно, щоб це був словник, щоб я мав доступ до однієї з клавіш.


3
Чи можете ви показати нам приклад вашого файлу JSON?
Mac

Я намагаюся отримати доступ до ключа "datapoints" graphite.sdsc.edu:8443/render/…
lawchit

4
Ваш базовий елемент - це список. спробуйте json1_data[0]['datapoints'].
gddc

гадаю, я б сказав, що ваш json - це список не словник
Joran Beasley

1
З того, що нам показав наш інструктор, коли він вводив (json1_data), його придумали як тип «дикту». Дякую за допомогу всім!
lawchit

Відповіді:


277

Ваш JSON - це масив із одним об’єктом всередині, тому, читаючи його, ви отримуєте список зі словником всередині. Ви можете отримати доступ до свого словника, відкривши пункт 0 у списку, як показано нижче:

json1_data = json.loads(json1_str)[0]

Тепер ви можете отримати доступ до даних, збережених у точках, так само, як ви очікували:

datapoints = json1_data['datapoints']

У мене є ще одне питання, якщо хтось може вкусити: я намагаюся взяти середнє значення перших елементів у цих точках (тобто точок даних [0] [0]). Тільки для того, щоб перерахувати їх, я намагався робити точки даних [0: 5] [0], але все, що я отримую, - це перша точка даних з обома елементами, на відміну від того, щоб хотіти отримати перші 5 точок даних, що містять лише перший елемент. Чи є спосіб це зробити?

datapoints[0:5][0]не робить те, що ви очікуєте. datapoints[0:5]повертає новий фрагмент списку, що містить лише перші 5 елементів, а потім додавання [0]в кінці його займе лише перший елемент з цього результуючого фрагмента списку . Що потрібно використовувати для отримання потрібного результату - це розуміння списку :

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

Ось простий спосіб розрахунку середнього:

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

Якщо ви готові встановити NumPy , тоді це ще простіше:

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

Використання ,оператора з синтаксисом нарізки для масивів NumPy має таку поведінку, якої ви спочатку очікували з фрагментами списку.


Дякую за це! У мене є ще одне питання, чи може хтось вкусити: я намагаюся взяти середнє значення перших елементів у цих точках (тобто точок даних [0] [0]). Тільки для того, щоб перерахувати їх, я намагався робити точки даних [0: 5] [0], але все, що я отримую, - це перша точка даних з обома елементами, на відміну від того, щоб хотіти отримати перші 5 точок даних, що містять лише перший елемент. Чи є спосіб це зробити?
lawchit

2
@lawchit - Дивіться мою оновлену відповідь. Якщо ви збираєтеся займатися математикою з цими даними, я дуже рекомендую використовувати NumPy.
DaoWen

Цей заслуговує ще 100 балів :-) Я шукав це рішення протягом 1 цілого дня
Мамун

16

Ось простий фрагмент, який читається у jsonтекстовому файлі зі словника. Зауважте, що ваш файл json повинен відповідати стандарту json, тому він повинен мати "подвійні лапки, а не 'одиничні лапки.

Ваш файл dump.txt JSON:

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

Сценарій Python:

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

8

Ви можете використовувати наступне:

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

Найкращий спосіб завантаження даних JSON у словник - Ви можете користуватися вбудованим навантажувачем json.

Нижче наведено фрагмент зразка, який можна використовувати.

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

чи автоматично в цьому випадку команда 'open' закриває файл json? Я помітив, що ви не використовуєте менеджер контексту.
Мондра

1
@Moondra U доведеться використовувати файл close () для закриття файлів
Sampat Kumar

2
@Moondra ви також можете використовувати with()оператор замість того, щоб відкривати та закривати файл із сайту: with open("welcome.txt") as file: Див.: Pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Я працюю з кодом Python для REST API, тому це для тих, хто працює над подібними проектами.

Я витягую дані з URL-адреси за допомогою POST-запиту, а необроблений вихід - JSON. Чомусь вихід є вже словником, а не списком, і я можу відразу ж посилатися на вкладені словникові клавіші, як це:

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

де datapoint_1 знаходиться всередині словника точок даних.


-1

передавати дані за допомогою JavaScript ajax від методів 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);
              }
            }
          }

погляди джанго

    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
це відповідь на запитання?
Siong Thye Goh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.