“ TypeError: (จำนวนเต็ม) ไม่ใช่ JSON ต่อเนื่องได้” เมื่อทำการซีเรียล JSON ใน Python?


162

ฉันพยายามส่งพจนานุกรมอย่างง่ายไปยังไฟล์ json จากไพ ธ อน แต่ฉันได้รับข้อความ "TypeError: 1425 ไม่ใช่ 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()

หากฉันเพิ่มอาร์กิวเมนต์เริ่มต้นแล้วมันจะเขียน แต่ค่าจำนวนเต็มจะถูกเขียนไปยังไฟล์ json เป็นสตริงซึ่งไม่พึงประสงค์

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


1
สิ่งนี้ดูเหมือนจะไม่ "ซ้ำซ้อน" คำถามนั้น ..

8
ฉันพบปัญหาของฉัน ปัญหาคือว่าจำนวนเต็มของฉันเป็นจริงพิมพ์ numpy.int64
user1329894

@ user1329894 โพสต์เป็นวิธีแก้ปัญหา / คำอธิบายและปิดตัวเอง ..

-0 สำหรับการเขียนตัวย่อที่น้อยที่สุดซึ่งไม่ได้สร้างข้อผิดพลาดซ้ำ
รัสเซล Borogove

คำตอบ:


268

ฉันพบปัญหาของฉัน numpy.int64ปัญหาก็คือว่าจำนวนเต็มของฉันถูกพิมพ์จริง


22
ฉันต้องจัดการกับปัญหานี้ด้วยและคำตอบของคุณก็ชี้ให้ฉันไปในทิศทางที่ถูกต้อง ฉันแค่ต้องการเพิ่มลิงค์ไปยังคำถามอื่นที่สามารถช่วยในการแก้ปัญหาได้จริง
JAC

19
ที่ต้องการจะมีความสุขถ้าเกิดข้อผิดพลาด JSON unserializable สามารถแสดงประเภทของวัตถุที่ ...
ฟ Dernoncourt

6
นี่เป็นวิธีที่เป็นระเบียบเรียบร้อยที่ใช้ serializer ที่กำหนดเอง
โอเว่น

17
นั่นเป็นปัญหา แต่อะไรคือทางออก?
BallpointBen

5
x.astype (int) หรือ int (x)
zelcon

50

ดูเหมือนว่าอาจมีปัญหาในการดัมพ์ numpy.int64 ไปยังสตริง json ใน Python 3 และทีม python มีการสนทนาเกี่ยวกับเรื่องนี้แล้ว รายละเอียดเพิ่มเติมสามารถพบได้ที่นี่

มีวิธีแก้ไขโดย Serhiy Storchaka มันใช้งานได้ดีมากฉันเลยวางมันไว้ที่นี่:

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

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

การแก้ปัญหาที่ยอดเยี่ยมโดย Serhiy โปรดตรวจสอบวิธีการของเขา และเพื่อเพิ่มเพียง: json.dumps (yourObject, default = default); ชอบที่นี่.
Pranzell

4

วิธีนี้แก้ไขปัญหาสำหรับฉัน:

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

4

เพียงแค่แปลงตัวเลขจากint64(จาก numpy) intเพื่อ

ตัวอย่างเช่นถ้าตัวแปรxคือ int64:

int(x)

ถ้าเป็นอาร์เรย์ของ int64:

map(int, x)

3

เป็น @JAC ชี้ให้เห็นในความคิดเห็นของคำตอบที่จัดอันดับสูงสุดของการแก้ปัญหาทั่วไป (สำหรับทุกประเภท numpy) สามารถพบได้ในด้าย แปลง dtypes numpy ประเภทหลามพื้นเมือง

อย่างไรก็ตามฉันจะเพิ่มเวอร์ชันของโซลูชันด้านล่างเนื่องจากในกรณีของฉันฉันต้องการโซลูชันทั่วไปที่รวมคำตอบเหล่านี้และคำตอบของเธรดอื่น สิ่งนี้ควรใช้งานได้กับเกือบทุกประเภท

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

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

คำตอบที่ดีแน่นอน
jtlz2

2

นี่อาจเป็นการตอบสนองที่ล่าช้า แต่เมื่อเร็ว ๆ นี้ฉันได้รับข้อผิดพลาดเดียวกัน หลังจากการท่องหลายครั้งโซลูชันนี้ช่วยฉัน

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__()

โทรmyconverterเข้าjson.dumps()ด้านล่างjson.dumps(alerts, default=myconverter).


1

อีกวิธีหนึ่งคุณสามารถแปลงวัตถุของคุณเป็น dataframe ก่อน:

df = pd.DataFrame(obj)

จากนั้นบันทึกลงdataframeในjsonไฟล์:

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

หวังว่านี่จะช่วยได้



0

ปัญหาเดียวกัน. รายการมีจำนวนประเภท numpy.int64 ซึ่งจะโยน TypeError วิธีแก้ปัญหาด่วนสำหรับฉันคือการ

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

ซึ่งจะแปลง list เป็น str () และ eval () ฟังก์ชั่นประเมิน "String" เช่นการแสดงออกของหลามและส่งกลับผลลัพธ์เป็นรายการของจำนวนเต็มในกรณีของฉัน


เพิ่งสังเกตเห็น eval (str ()) ช้ามากดังนั้นใช้ด้วยความระมัดระวัง คำตอบของ @ shiva ดีกว่ามาก: json.dumps (แจ้งเตือน, default = myconverter)
user319436

0

ใช้

from numpyencoder import NumpyEncoder

เพื่อแก้ไขปัญหานี้ใน 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.