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)ます。

何が欠けていますか?これを辞書にして、キーの1つにアクセスできるようにする必要があります。


3
JSONファイルの例を見せていただけますか?
Mac

私は、「データポイント」キーにアクセスしようとしています graphite.sdsc.edu:8443/render/...
lawchit

4
基本アイテムはリストです。試してくださいjson1_data[0]['datapoints']
gddc 2013年

おそらく、あなたのjsonは辞書ではなくリストだと思います
Joran Beasley

1
インストラクターが示したことから、彼がtype(json1_data)を行ったとき、彼は 'dict'タイプとして登場しました。みなさん助けてくれてありがとう!
2013年

回答:


276

JSONは内部に単一のオブジェクトを含む配列であるため、それを読み取ると、内部に辞書を含むリストを取得します。以下に示すように、リストのアイテム0にアクセスすることで、辞書にアクセスできます。

json1_data = json.loads(json1_str)[0]

今、あなたは内に格納されたデータにアクセスできるデータポイントを、あなたが期待していただけのように:

datapoints = json1_data['datapoints']

誰かが噛むことができるかどうか、もう1つ質問があります。これらのデータポイント(つまり、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の配列のスライス構文で演算子を使用すると、リストスライスで本来期待されていた動作が行われます。


これありがとう!誰かが噛むことができるかどうか、もう1つ質問があります。これらのデータポイント(つまり、datapoints [0] [0])の最初の要素の平均を取ろうとしています。それらをリストするために、データポイント[0:5] [0]を実行してみましたが、最初の要素のみを含む最初の5つのデータポイントを取得するのではなく、両方の要素を持つ最初のデータポイントを取得します。これを行う方法はありますか?
2013年

2
@lawchit-私の更新された回答を参照してください。このデータを使って計算を行う場合は、NumPyを使用することを強くお勧めします。
DaoWen 2013年

これはさらに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データをディクショナリにロードする最善の方法は、組み込みの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

私はREST APIのPythonコードを使用しているので、これは同様のプロジェクトに取り組んでいる人向けです。

POSTリクエストを使用してURLからデータを抽出し、生の出力はJSONです。何らかの理由で、出力は既にリストではなく辞書であり、次のようにネストされた辞書キーをすぐに参照できます。

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

ここで、datapoint_1はdatapoints辞書内にあります。


-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
これは質問への回答ですか?
ソンティゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.