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]
RRC
sumber
6
Apakah Anda yakin file tersebut berisi JSON yang valid?
Pil Ledakan
1
kemungkinan duplikat nilai Parsing dari file JSON dengan Python
Pureferret
Lihat juga: Baca & Tulis contoh untuk JSON
Martin Thoma
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? .

ubomb
sumber
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.

pengguna1876508
sumber
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.

Zongjun
sumber
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)
Thejesh PR
sumber
1

Anda dapat menggunakan panda library untuk membaca file JSON.

import pandas as pd
df = pd.read_json('strings.json',lines=True)
print(df)
drorhun
sumber
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":"[email protected]"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"[email protected]"
                }
              ] 
}

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':'[email protected]'}
{'emp_name':'Aditya','emp_emailId':'[email protected]'}
Aditya patil
sumber