"टाइपर्रर: (इंटेगर) जेएसएन सीरीज़ेबल नहीं है" पायथन में जेएसएन को क्रमबद्ध करते समय?


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

यदि मैं डिफ़ॉल्ट तर्क जोड़ता हूं, तो यह लिखता है, लेकिन पूर्णांक मानों को स्ट्रिंग के रूप में json फ़ाइल में लिखा जाता है, जो अवांछनीय है।

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


1
यह उस प्रश्न को "डुप्लिकेट" नहीं करता है ..

8
मुझे मेरी समस्या का पता चला। मुद्दा यह था कि मेरे पूर्णांक वास्तव में numpy.int64 टाइप थे।
user1329894

@ user1329894 समाधान / स्पष्टीकरण और स्व-पास के रूप में पोस्ट करें

-0 एक न्यूनतम रेप्रो लिखने के लिए जो वास्तव में बग को पुन: पेश नहीं करता है।
रसेल बोरोगोव

जवाबों:


268

मुझे मेरी समस्या का पता चला। मुद्दा यह था कि मेरे पूर्णांक वास्तव में टाइप थे numpy.int64


22
मुझे इस मुद्दे से भी निपटना था, और आपके जवाब ने मुझे सही दिशा में इशारा किया। मैं सिर्फ एक और सवाल का लिंक जोड़ना चाहता था जो वास्तव में समस्या को हल करने में मदद कर सकता है।
JAC

19
यह अच्छा होगा यदि JSON अचूक त्रुटि संदेश ऑब्जेक्ट के प्रकार को प्रदर्शित कर सके ...
Franck Dernoncourt

6
यहाँ एक सुव्यवस्थित समाधान है जो एक कस्टम धारावाहिक का उपयोग करता है।
ओवेन

17
यही समस्या है, लेकिन समाधान क्या है?
बॉलपॉइंटबैन

5
x.astype (int) या int (x)
zelcon

50

ऐसा लगता है कि पायथन 3 में जॉगन स्ट्रिंग में numpy.int64 को डंप करने के लिए एक मुद्दा हो सकता है और अजगर टीम पहले से ही इसके बारे में बातचीत कर सकती है। अधिक विवरण यहां पाया जा सकता है

Serhiy Storchaka द्वारा प्रदान किया गया वर्कअराउंड है। यह बहुत अच्छी तरह से काम करता है इसलिए मैं इसे यहाँ पेस्ट करता हूँ:

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

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

सेरही द्वारा प्रदान किया गया एक अद्भुत समाधान। कृपया उसका दृष्टिकोण देखें। और जोड़ने के लिए, बस: json.dumps (yourObject, default = default); जैसे यहाँ।
प्रांजल


4

बस संख्याओं को int64(numpy से) में परिवर्तित करें int

उदाहरण के लिए, यदि चर xएक int64 है:

int(x)

यदि int64 का सरणी है:

map(int, x)

3

जैसा कि @JAC ने उच्चतम श्रेणी के उत्तर की टिप्पणियों में बताया है, जेनेरिक समाधान (सभी संख्यात्मक प्रकारों के लिए) धागे में पाया जा सकता है, देशी अजगर प्रकारों को सुन्न dtypes परिवर्तित करना

फिर भी, मैं नीचे दिए गए समाधान के अपने संस्करण को जोड़ दूंगा, क्योंकि मेरे मामले में मुझे एक सामान्य समाधान की आवश्यकता थी जो इन उत्तरों को जोड़ती है और दूसरे धागे के उत्तरों के साथ। यह लगभग सभी सुन्न प्रकार के साथ काम करना चाहिए।

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 है जो एक TypeError फेंकता है। मेरे लिए त्वरित समाधान था

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

जो सूची को str () और eval () फ़ंक्शन में परिवर्तित करता है, "स्ट्रिंग" का मूल्यांकन एक अजगर अभिव्यक्ति की तरह करता है और मेरे मामले में पूर्णांकों की सूची के रूप में परिणाम देता है।


बस देखा गया eval (str ()) बहुत धीमे है इसलिए सावधानी के साथ उपयोग करें। @ शिवा का जवाब बहुत बेहतर है: json.dumps (अलर्ट, डिफ़ॉल्ट = 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.