2012-08-02 37 views
11

Tôi có một danh sách, có thể trống hoặc không trống.Buộc json đổ một đối tượng json ngay cả khi danh sách trống rỗng

Tôi muốn tạo tệp mới chứa danh sách đó ở định dạng dễ đọc và dễ đọc cho tập lệnh tiếp theo của tôi để phân tích cú pháp. Trong trường hợp danh sách không trống, điều này làm việc tốt và kịch bản tiếp theo của tôi đọc trong tệp json. Nhưng khi danh sách trống, tôi nhận được "ValueError: Không có đối tượng JSON nào có thể được giải mã." Điều này có ý nghĩa, bởi vì khi tôi mở tệp, thực sự không có nội dung và do đó không có đối tượng JSON.

Tôi đồng ý với thực tế là một số danh sách trống. Vì vậy, hoặc là tôi muốn viết một đối tượng JSON trống hoặc tôi muốn kịch bản trình đọc của tôi được OK khi không tìm thấy một đối tượng JSON.

Dưới đây là các mã có liên quan:

Writer Script

favColor = [] OR favColor = ['blue'] OR favColor = ['blue', 'green'] 
fileName = 'favoriteColor.json' 
outFile = open(fileName, 'w') 
json.dump(outFile, favColor) 
outFile.close() 

đọc Script

fileName = 'favoriteColor.json' 
inFile = open(fileName, 'r') 
colors = json.load(inFile) 
inFile.close() 

Bất kỳ sự giúp đỡ hoặc gợi ý nhiều đánh giá cao. Nếu tôi cần cung cấp thêm lý do cho lý do tại sao tôi làm điều này, tôi có thể cung cấp điều đó là tốt, chỉ nghĩ rằng tôi muốn bắt đầu với tối thiểu cần thiết để hiểu được vấn đề.

Trả lời

15

Sửa đổi kịch bản đọc của bạn như thế này:

with open('favoriteColor.json') as inFile: 
    try: 
     colors = json.load(inFile) 
    except ValueError: 
     colors = [] 

này cố gắng tải các tập tin như một json. Nếu nó không thành công do lỗi giá trị, chúng tôi biết rằng điều này là do json trống. Do đó, chúng tôi chỉ có thể gán màu cho danh sách trống. Bạn cũng nên sử dụng cấu trúc "có" để tải các tệp vì nó tự động đóng chúng.

+0

Đẹp và sạch +1 –

+0

Cảm ơn bạn, được đánh giá cao và giải thích rõ lý do tại sao "có mở() là ..." được ưu tiên. Tôi đã nghe mọi người nói rằng nó được ưa thích trước đây, nhưng không có lý do nó không bao giờ khiến tôi thay đổi. – rcorty

2

Tôi sẽ không thực hiện phương pháp bạn đang cố gắng. Tôi sẽ thay json.dump một cuốn từ điển, ví dụ:

d = {'var1': '123', 'var2': [1, 2, 3]} 
json.dump(d, fileout) 

Sau đó sử dụng dict.get để mặc định nó vào một giá trị phù hợp:

json_dict = json.load(filein) 
favColor = json_dict.get('favColor', []) 

Sau đó, bạn vẫn có giá trị bắt buộc có thể ngoại trừ nếu không có mặt bằng [] ký hiệu.

Đặt logic của các giá trị thiếu trong mã của bạn thay vì phân tích cú pháp JSON ...

2

Bạn cũng có thể thêm tên của biến trong tệp json của bạn:

json.dump({'favorite-color': favColor}, outFile) 
outFile.close() 

Và xử lý các trường hợp của một danh sách trống khi đọc file json:

data = json.load(inFile) 

if len(data['favorite-color']) == 0: 
    ... 

lưu ý rằng bạn phải cung cấp các đối tượng mà bạn muốn lưu và sau đó các đối tượng tập tin giống như để json.dump.

Các vấn đề liên quan