Loại TypeError: (Integer) không phải là tuần tự hóa JSON khi tuần tự hóa JSON trong Python?


162

Tôi đang cố gắng gửi một từ điển đơn giản đến một tệp json từ python, nhưng tôi vẫn nhận được thông báo "TypeError: 1425 không phải là tuần tự hóa JSON".

import json
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8'))
afile.close()

Nếu tôi thêm đối số mặc định, thì nó ghi, nhưng các giá trị nguyên được ghi vào tệp json dưới dạng chuỗi, điều này là không mong muốn.

afile.write(json.dumps(alerts,encoding='UTF-8',default=str))


1
Điều này dường như không "trùng lặp" câu hỏi đó ..

8
Tôi tìm thấy vấn đề của tôi. Vấn đề là số nguyên của tôi thực sự là loại numpy.int64.
user1329894

@ user1329894 Đăng dưới dạng giải pháp / giải thích và tự đóng ..

-0 để viết một repro tối thiểu không thực sự tái tạo lỗi.
Russell Borogove

Câu trả lời:


268

Tôi tìm thấy vấn đề của tôi. Vấn đề là số nguyên của tôi thực sự là loại numpy.int64.


22
Tôi cũng phải đối phó với vấn đề này và câu trả lời của bạn đã chỉ cho tôi đi đúng hướng. Tôi chỉ muốn thêm một liên kết đến một câu hỏi khác có thể giúp giải quyết vấn đề.
JAC

19
Thật tuyệt nếu thông báo lỗi không thể định dạng JSON có thể hiển thị loại đối tượng ...
Franck Dernoncourt 21/07/2015

6
Đây là một giải pháp gọn gàng sử dụng một serializer tùy chỉnh.
Owen

17
Đó là vấn đề, nhưng giải pháp là gì?
BallpointBen

5
x.astype (int) hoặc int (x)
zelcon

50

Có vẻ như có thể có một vấn đề khi kết xuất numpy.int64 vào chuỗi json trong Python 3 và nhóm python đã có một cuộc trò chuyện về nó. Thông tin chi tiết có thể được tìm thấy ở đây .

Có một cách giải quyết được cung cấp bởi Serhiy Storchaka. Nó hoạt động rất tốt vì vậy tôi dán nó ở đây:

def convert(o):
    if isinstance(o, numpy.int64): return int(o)  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Một cách giải quyết tuyệt vời được cung cấp bởi Serhiy. Hãy kiểm tra cách tiếp cận của anh ấy. Và để thêm, chỉ cần: json.dumps (yourObject, default = default); như ở đây
Pranzell

4

Điều này giải quyết các vấn đề đối với tôi:

def serialize(self):
    return {
        my_int: int(self.my_int), 
        my_float: float(self.my_float)
    }

4

Chỉ cần chuyển đổi số từ int64(từ numpy) sang int.

Ví dụ: nếu biến xlà int64:

int(x)

Nếu là mảng của int64:

map(int, x)

3

như @JAC đã chỉ ra trong các bình luận của câu trả lời được đánh giá cao nhất, giải pháp chung (cho tất cả các loại numpy) có thể được tìm thấy trong luồng Chuyển đổi các loại dumpy numpy thành các loại python bản địa .

Tuy nhiên, tôi sẽ thêm phiên bản giải pháp bên dưới, vì trong trường hợp của tôi, tôi cần một giải pháp chung kết hợp các câu trả lời này và với các câu trả lời của chủ đề khác. Điều này sẽ làm việc với hầu hết các loại numpy.

def convert(o):
    if isinstance(o, np.generic): return o.item()  
    raise TypeError

json.dumps({'value': numpy.int64(42)}, default=convert)

Câu trả lời hay thật sự
jtlz2

2

Đây có thể là phản hồi muộn, nhưng gần đây tôi đã gặp lỗi tương tự. Sau khi lướt rất nhiều giải pháp này đã giúp tôi.

alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 15:30']}
def myconverter(obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        elif isinstance(obj, datetime.datetime):
            return obj.__str__()

Gọi myconvertertrong json.dumps()như dưới đây.json.dumps(alerts, default=myconverter).


1

Ngoài ra, bạn có thể chuyển đổi đối tượng của mình thành một khung dữ liệu trước:

df = pd.DataFrame(obj)

và sau đó lưu tệp này dataframetrong một jsontệp:

df.to_json(path_or_buf='df.json')

Hi vọng điêu nay co ich


0

Bạn có Kiểu dữ liệu Numpy, Chỉ cần thay đổi thành kiểu dữ liệu int () hoặc float () bình thường. nó sẽ hoạt động tốt


0

Vấn đề tương tự. Danh sách chứa các số loại numpy.int64 sẽ ném TypeError. Cách giải quyết nhanh đối với tôi là

mylist = eval(str(mylist_of_integers))
json.dumps({'mylist': mylist})

mà chuyển đổi danh sách thành hàm str () và hàm eval () để đánh giá Chuỗi Chuỗi ra như một biểu thức python và trả về kết quả dưới dạng danh sách các số nguyên trong trường hợp của tôi.


Chỉ cần lưu ý eval (str ()) là rất chậm vì vậy sử dụng một cách thận trọng. Câu trả lời của @ shiva tốt hơn nhiều: json.dumps (cảnh báo, mặc định = myconverter)
user319436

0

sử dụng

from numpyencoder import NumpyEncoder

để giải quyết vấn đề này trong Python3:

import json
from numpyencoder import NumpyEncoder
alerts = {'upper':[1425],'lower':[576],'level':[2],'datetime':['2012-08-08 
15:30']}
afile = open('test.json','w')
afile.write(json.dumps(alerts,encoding='UTF-8',cls=NumpyEncoder))
afile.close()
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.