Membaca JSON dari file?


320

Saya mendapatkan sedikit sakit kepala hanya karena pernyataan yang terlihat sederhana dan mudah adalah melemparkan beberapa kesalahan di wajah saya.

Saya memiliki file json bernama strings.json seperti ini:

"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
            {"-name": "address", "#text": "Address"}]

Saya ingin membaca file json, hanya untuk saat ini. Saya memiliki pernyataan ini yang saya temukan, tetapi tidak berfungsi:

import json
from pprint import pprint

with open('strings.json') as json_data:
    d = json.loads(json_data)
    json_data.close()
    pprint(d)

Kesalahan yang ditampilkan pada konsol adalah ini:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]

Diedit

Diubah dari json.loadsmenjadijson.load

dan dapatkan ini:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.load(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]

6
Apakah Anda yakin file tersebut berisi JSON yang valid?
Pil Ledakan



File Anda adalah format json yang tidak valid. Ubah ke: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex

Jawaban:


546

The json.load()Metode (tanpa "s" di "load") dapat membaca file langsung:

import json

with open('strings.json') as f:
    d = json.load(f)
    print(d)

Anda menggunakan json.loads()metode ini , yang hanya digunakan untuk argumen string .

Sunting: Pesan baru adalah masalah yang sama sekali berbeda. Dalam hal ini, ada beberapa json yang tidak valid dalam file itu. Untuk itu, saya akan merekomendasikan menjalankan file melalui validator json .

Ada juga solusi untuk memperbaiki json seperti misalnya Bagaimana cara saya secara otomatis memperbaiki string JSON yang tidak valid? .


2
hm ... Saya berubah dari json.loads ke json.load tapi saya mendapatkan pesan yang bagus.
RRC

5
Ah, pesan baru itu adalah masalah yang sama sekali berbeda. Dalam hal ini, ada beberapa json yang tidak valid dalam file itu. Untuk itu, saya akan merekomendasikan menjalankan file melalui validator json .
ubomb

3
mengerti! File itu hilang EOF. File tidak berakhir dengan benar. Saya tidak akan memperhatikan bahwa jika itu bukan rekomendasi baik Anda! Terima kasih!
RRC

1
ubomb, jika Anda dapat mengubah Anda menjawab kepada saya untuk menandainya diterima. Bebas! Saya akan menandainya.
RRC

Saya harus membuka file dengan flag byte, maka saya dapat menggunakan metode json.load, mengapa? Saya mendapat Py3.6
Grzegorz Krug

113

Ini adalah salinan kode yang berfungsi dengan baik untuk saya

import json

with open("test.json") as json_file:
    json_data = json.load(json_file)
    print(json_data)

dengan data

{
    "a": [1,3,"asdf",true],
    "b": {
        "Hello": "world"
    }
}

Anda mungkin ingin membungkus json.load line Anda dengan try catch karena JSON yang tidak valid akan menyebabkan pesan kesalahan stacktrace.


41

Masalahnya menggunakan dengan pernyataan:

with open('strings.json') as json_data:
    d = json.load(json_data)
    pprint(d)

File sudah akan ditutup secara implisit. Tidak perlu menelepon json_data.close()lagi.


1
Harap hapus json_data.close (). Seperti disebutkan, itu akan disebut secara implisit.
Bonnie Varghese

1
@Ongjun: Harap perbaiki banyak ke json.load (json_data).
Knight71

2
untuk mencetak, saya harus menggunakan:print(json.dumps(d,sort_keys=True,indent=2))
Mike D

25

Dalam python 3, kita bisa menggunakan metode di bawah ini.

Baca dari file dan konversikan ke JSON

import json
from pprint import pprint

# Considering "json_list.json" is a json file

with open('json_list.json') as fd:
     json_data = json.load(fd)
     pprint(json_data)

dengan pernyataan secara otomatis menutup deskriptor file yang dibuka.


String ke JSON

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)


1

Anda dapat menggunakan panda library untuk membaca file JSON.

import pandas as pd
df = pd.read_json('strings.json',lines=True)
print(df)

0

Ini bekerja untuk saya.

json.load () menerima objek file, mem-parsing data JSON, mengisi kamus Python dengan data dan mengembalikannya kepada Anda.

Misalkan file JSON seperti ini:

{
   "emp_details":[
                 {
                "emp_name":"John",
                "emp_emailId":"john@gmail.com"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"adityatest@yahoo.com"
                }
              ] 
}

import json 

# Opening JSON file 
f = open('data.json',) 

# returns JSON object as  
# a dictionary 
data = json.load(f) 

# Iterating through the json 
# list 
for i in data['emp_details']: 
    print(i) 

# Closing file 
f.close()

#Output:
{'emp_name':'John','emp_emailId':'john@gmail.com'}
{'emp_name':'Aditya','emp_emailId':'adityatest@yahoo.com'}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.