将JSON字符串转换为字典未列出


213

我正在尝试传递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

4
您的基本项目是一个列表。尝试一下json1_data[0]['datapoints']
gddc

猜我会说您的json是一个列表,而不是字典
Joran Beasley 2013年

1
从我们的讲师给我们看的内容中,当他键入(json1_data)时,他出现为“ dict”类型。谢谢大家的帮助!
lawchit

Answers:


276

JSON是一个内部有单个对象的数组,因此当您读入JSON时,会得到一个内部带有字典的列表。您可以通过访问列表中的项目0来访问字典,如下所示:

json1_data = json.loads(json1_str)[0]

现在,您可以按预期访问存储在数据点中的数据

datapoints = json1_data['datapoints']

我还有一个问题,是否有人可以咬:我正在尝试获取这些数据点(即datapoints [0] [0])中第一个元素的平均值。只是列出它们,我尝试做datapoints [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数组的切片语法一起使用会产生您最初期望的与列表切片相同的行为。


这次真是万分感谢!我还有一个问题,是否有人可以咬:我正在尝试获取这些数据点(即datapoints [0] [0])中第一个元素的平均值。只是列出它们,我尝试做datapoints [0:5] [0],但我得到的只是两个元素的第一个数据点,而不是想要获取仅包含第一个元素的前5个数据点。有没有办法做到这一点?
lawchit

2
@lawchit-请参阅我的最新答案。如果您要对这些数据进行数学运算,则强烈建议您使用NumPy。
道文

这个值得再加100分:-)我一直在寻找这种解决方案,整整1天
Mamun

16

这是一个简单的代码片段,可json从字典中读取文本文件。请注意,您的json文件必须遵循json标准,因此它必须具有"双引号而不是'单引号。

您的JSON dump.txt文件:

{"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数据加载到Dictionary中的最好方法是可以使用内置的json加载器。

以下是可以使用的示例代码段。

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

在这种情况下,“打开”命令会自动关闭json文件吗?我注意到您没有使用上下文管理器。
蒙德拉

1
@Moondra U必须使用close()关闭文件
Sampat Kumar,

2
@Moondra,您也可以使用with()运算符,而不必打开和关闭文件。从站点:with open("welcome.txt") as file: 参见:pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44 '18

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

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
这是问题的答案吗?
宋泰悟
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.