পাইথনের জেএসওএনকে সিরিয়ালকরণ করার সময় "টাইপআরার: (পূর্ণসংখ্যা) জাসন সিরিয়ালাইজযোগ্য নয়"?


162

আমি পাইথন থেকে একটি জাসন ফাইলে একটি সাধারণ অভিধান পাঠানোর চেষ্টা করছি, তবে আমি "টাইপরর: 1425 জেএসএন সিরিয়ালাইজযোগ্য নয়" বার্তাটি পেয়ে যাচ্ছি।

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

আমি যদি ডিফল্ট যুক্তি যুক্ত করি, তবে এটি লিখবে, তবে পূর্ণসংখ্যা মানগুলি স্ট্রিং হিসাবে জসন ফাইলে লেখা হয়, যা অনাকাঙ্ক্ষিত।

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


1
এটি সেই প্রশ্নের "সদৃশ" হয়ে দেখা দেয় না ..

8
আমি আমার সমস্যা খুঁজে পেয়েছি। সমস্যাটি হ'ল আমার পূর্ণসংখ্যাগুলি প্রকৃতপক্ষে টাইপ করা ছিল numpy.int64।
ব্যবহারকারী 1329894

@ ব্যবহারকারী 1329894 সমাধান / ব্যাখ্যা এবং স্ব-নিকট হিসাবে পোস্ট করুন ..

একটি সর্বনিম্ন repro লেখার জন্য যা আসলে বাগটি পুনরুত্পাদন করে না।
রাসেল বোরোগোভ

উত্তর:


268

আমি আমার সমস্যা খুঁজে পেয়েছি। বিষয়টি ছিল আমার পূর্ণসংখ্যাগুলি আসলে টাইপ ছিল numpy.int64


22
আমাকেও এই সমস্যাটি মোকাবেলা করতে হয়েছিল, এবং আপনার উত্তর আমাকে সঠিক দিকে নির্দেশ করেছে। আমি কেবলমাত্র অন্য প্রশ্নের একটি লিঙ্ক যুক্ত করতে চেয়েছিলাম যা সমস্যাটি সমাধানে আসলে সহায়তা করতে পারে।
JAC

19
JSON unserializable ত্রুটি বার্তা অবজেক্টের ধরণটি প্রদর্শন করতে পারলে ভাল
লাগত

6
এখানে একটি পরিচ্ছন্ন সমাধান রয়েছে যা একটি কাস্টম সিরিয়ালাইজার ব্যবহার করে।
ওভেন

17
এটাই সমস্যা, তবে এর সমাধান কী?
বলপয়েন্টবেন

5
x.astype (int) বা int (x)
জেলকন

50

দেখে মনে হচ্ছে পাইপথন 3-তে numpy.int64 কে জসন স্ট্রিংয়ের মধ্যে ফেলে দেওয়ার কোনও সমস্যা হতে পারে এবং পাইথন টিম ইতিমধ্যে এটি সম্পর্কে কথোপকথন করেছে। আরও বিশদ এখানে পাওয়া যাবে

সেরিহ স্টোরচাকা একটি ওয়ার্কআরন্ড সরবরাহ করেছেন। এটি খুব ভাল কাজ করে তাই আমি এটি এখানে আটকান:

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

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

Serhiy দ্বারা সরবরাহ একটি দুর্দান্ত কাজ। দয়া করে তার পদ্ধতির পরীক্ষা করুন। এবং যুক্ত করতে, কেবল: json.dumps (আপনারঅজেক্ট, ডিফল্ট = ডিফল্ট); এখানকার মত.
প্রাণজেল


4

কেবল সংখ্যাগুলি থেকে int64( রূপান্তরিত ) থেকে রূপান্তর করুন int

উদাহরণস্বরূপ, যদি ভেরিয়েবলটি xএকটি int64 হয়:

int(x)

যদি int64 এর অ্যারে হয়:

map(int, x)

3

@ জ্যাক যেমন সর্বোচ্চ রেট প্রাপ্ত উত্তরের মন্তব্যে উল্লেখ করেছে, জেনেরিক দ্রবণ (সমস্ত নপী ধরণের জন্য) থ্রেডে পাওয়া যাবে যে আংগুর ধরণের টাইপগুলিকে দেশীয় অজগর প্রকারে রূপান্তরিত করে

তবুও, আমি নীচের সমাধানটির আমার সংস্করণ যুক্ত করব, আমার ক্ষেত্রে আমার যেমন একটি জেনেরিক সমাধান প্রয়োজন যা এই উত্তরগুলি এবং অন্যান্য থ্রেডের উত্তরগুলির সাথে মিলিত করে। এটি প্রায় সমস্ত অদ্ভুত প্রকারের সাথে কাজ করা উচিত।

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

বিকল্পভাবে আপনি প্রথমে আপনার অবজেক্টটিকে ডেটাফ্রেমে রূপান্তর করতে পারেন:

df = pd.DataFrame(obj)

এবং তারপরে dataframeএটি একটি jsonফাইলে সংরক্ষণ করুন:

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

আশাকরি এটা সাহায্য করবে



0

একই সমস্যা. তালিকায় numpy.int64 প্রকারের সংখ্যা রয়েছে যা একটি টাইপরর ফেলে দেয়। আমার জন্য দ্রুত কাজ ছিল

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

যা তালিকে str () এ রূপান্তর করে এবং eval () ফাংশনটি পাইথন এক্সপ্রেশনের মতো "স্ট্রিং" এর মূল্যায়ন করে এবং ফলাফলটি আমার ক্ষেত্রে পূর্ণসংখ্যার তালিকা হিসাবে প্রদান করে।


সবেমাত্র লক্ষ্য করা হয়েছে eval (str ()) খুব ধীর তাই সতর্কতার সাথে ব্যবহার করুন। @ শিবের উত্তর আরও ভাল: json.dumps (সতর্কতা, ডিফল্ট = myconverter)
user319436

0

ব্যবহার

from numpyencoder import NumpyEncoder

পাইথন 3 এ এই সমস্যাটি সমাধান করতে:

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.