Dump sang JSON thêm dấu ngoặc kép bổ sung và thoát dấu ngoặc kép


86

Tôi đang truy xuất dữ liệu Twitter bằng công cụ Python và kết xuất chúng ở định dạng JSON vào đĩa của mình. Tôi nhận thấy một sự thoát ra ngoài ý muốn của toàn bộ chuỗi dữ liệu cho một tweet được đặt trong dấu ngoặc kép. Hơn nữa, tất cả các dấu ngoặc kép của định dạng JSON thực tế đều được thoát bằng dấu gạch chéo ngược.

Chúng trông như thế này:

"{\" create_at \ ": \" T6, ngày 8 tháng 8 11:04:40 +0000 2014 \ ", \" id \ ": 497699913925292032,

Làm thế nào để tôi tránh điều đó? Nó phải là:

{"create_at": "Thứ sáu, ngày 8 tháng 8 11:04:40 +0000 năm 2014" .....

Mã xuất tệp của tôi trông giống như sau:

with io.open('data'+self.timestamp+'.txt', 'a', encoding='utf-8') as f:
            f.write(unicode(json.dumps(data, ensure_ascii=False)))
            f.write(unicode('\n'))

Việc thoát ngoài ý muốn gây ra sự cố khi đọc trong tệp JSON ở bước xử lý sau.

Câu trả lời:


140

Bạn đang mã hóa kép các chuỗi JSON của mình. datađã một chuỗi JSON, và không cần phải được mã hóa một lần nữa :

>>> import json
>>> not_encoded = {"created_at":"Fri Aug 08 11:04:40 +0000 2014"}
>>> encoded_data = json.dumps(not_encoded)
>>> print encoded_data
{"created_at": "Fri Aug 08 11:04:40 +0000 2014"}
>>> double_encode = json.dumps(encoded_data)
>>> print double_encode
"{\"created_at\": \"Fri Aug 08 11:04:40 +0000 2014\"}"

Chỉ cần ghi những điều này trực tiếp vào tệp của bạn:

with open('data{}.txt'.format(self.timestamp), 'a') as f:
    f.write(data + '\n')

f.write (data + '\ n') - tương quan với - data = encoded_data - từ ví dụ của bạn.
Rich Elswick

@RichElswick OP sử dụng biến data, chứa dữ liệu JSON đã được mã hóa, vì vậy có, tôi đã sử dụng tên biến encoded_datađể minh họa điều gì đang xảy ra.
Martijn Pieters

9

Một tình huống khác mà việc thoát không mong muốn này có thể xảy ra là nếu bạn cố gắng sử dụng json.dump () trên đầu ra được xử lý trước của json.dumps (). Ví dụ

import json, sys
json.dump({"foo": json.dumps([{"bar": 1}, {"baz": 2}])},sys.stdout)

sẽ cho kết quả

{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}

Để tránh điều này, bạn cần chuyển từ điển chứ không phải đầu ra của json.dumps (), ví dụ:

json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)

đầu ra mong muốn

{"foo": [{"bar": 1}, {"baz": 2}]}

(Tại sao bạn lại xử lý trước danh sách bên trong với json.dumps (), bạn hỏi? Chà, tôi có một chức năng khác đang tạo danh sách bên trong đó từ những thứ khác và tôi nghĩ sẽ hợp lý nếu trả về một đối tượng json từ chức năng đó ... Sai.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.