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

'데이터 포인트'키 흑연
.sdsc.edu

4
기본 항목은 목록입니다. 시도하십시오 json1_data[0]['datapoints'].
gddc

추측에 당신의 json은 사전이 아닌 목록입니다
Joran Beasley

1
우리 강사가 우리에게 보여준 것에서, 그는 type (json1_data)을했을 때 그의 'dict'타입으로 나타났습니다. 도와 주셔서 감사합니다!
lawchit

답변:


277

JSON은 내부에 단일 객체가있는 배열이므로 읽을 때 사전이있는 목록을 얻습니다. 아래와 같이 목록에서 항목 0에 액세스하여 사전에 액세스 할 수 있습니다.

json1_data = json.loads(json1_str)[0]

이제 예상 한대로 데이터 포인트에 저장된 데이터에 액세스 할 수 있습니다 .

datapoints = json1_data['datapoints']

누군가 물릴 수 있다면 한 가지 더 질문이 있습니다.이 데이터 포인트의 첫 번째 요소의 평균을 구하려고합니다 (예 : datapoints [0] [0]). 그것들을 나열하기 위해, 나는 datapoints [0 : 5] [0]을 시도했지만 첫 번째 요소 만 포함하는 처음 5 개의 datapoint를 얻는 것이 아니라 두 요소가있는 첫 번째 datapoint입니다. 이 방법이 있습니까?

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]). 그것들을 나열하기 위해, 나는 datapoints [0 : 5] [0]을 시도했지만 첫 번째 요소 만 포함하는 처음 5 개의 datapoint를 얻는 것이 아니라 두 요소가있는 첫 번째 datapoint입니다. 이것을 할 수있는 방법이 있습니까?
lawchit

2
@lawchit-업데이트 된 답변을 참조하십시오. 이 데이터로 수학을 할 예정이라면 NumPy를 사용하는 것이 좋습니다.
DaoWen

이것은 100 포인트가 더 필요합니다 :-) 나는이 솔루션을 하루 종일 찾고 있습니다
Mamun

16

다음은 json사전에서 텍스트 파일로 읽는 간단한 스 니펫입니다 . json 파일은 json 표준을 따라야하므로 "작은 따옴표 대신 큰 따옴표가 있어야 '합니다.

JSON dump.txt 파일 :

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

파이썬 스크립트 :

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 파일을 자동으로 닫습니까? 컨텍스트 관리자를 사용하지 않는 것으로 나타났습니다.
Moondra

1
@ Moondra U 파일을 닫으려면 close ()를 사용해야합니다
Sampat Kumar

2
@ Moondra 당신은 또한 with()파일을 열고 닫을 필요없이 연산자를 사용할 수 있습니다 사이트에서 : with open("welcome.txt") as file: 참조 : pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

REST API 용 Python 코드로 작업 중이므로 유사한 프로젝트를 수행하는 사람들을위한 것입니다.

POST 요청을 사용하여 URL에서 데이터를 추출하고 원시 출력은 JSON입니다. 어떤 이유로 출력은 이미 목록이 아닌 사전이며 중첩 된 사전 키를 다음과 같이 즉시 참조 할 수 있습니다.

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

여기서 datapoint_1은 데이터 포인트 사전 내에 있습니다.


-1

get 메소드에서 javascript ajax를 사용하여 데이터를 전달하십시오.

    **//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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.