列表作为JSON不可序列化的dict中的条目 [英] list as an entry in a dict not JSON serializable
问题描述
我需要将列表(或numpy数组)保存为JSON文件中的条目之一.我收到无法JSON序列化的"错误,并且我不知道如何解决它(以及为什么在将列表手动传递给字典时为什么没有得到它).
I need to save a list (or a numpy array) as one of the entries in a JSON file. I am getting the "not JSON-serializable" error, and I can’t figure out how to fix it (and also why I am not getting it when I am passing a list to the dictionary manually).
我的代码:
def get_col_stats(colname, numrows=None):
print('start reading the column')
df = pd.read_csv('faults_all_main_dp_1_joined__9-4-15.csv', engine='c', usecols=[colname], nrows = numrows)
print('finished reading ' + colname)
df.columns = ['col']
uniq = list(df.col.unique())
count = len(uniq)
print('unique count is', count)
if colname == 'faultDate':
return {'type': 'date', 'min': df.col.min(), 'max': df.col.max()}
elif count < 100000 or colname == 'name':
return {'type': 'factor', 'uniq': uniq}
else:
return {'type': 'numeric', 'min': df.col.min(), 'max': df.col.max()}
d = {}
i = 'faultCode'
d[i] = get_col_stats(i, numrows=1000)
print(d)
print(type(d['faultCode']['uniq']))
json.dumps(d)
出局:
start reading the column
finished reading faultCode
unique count is 114
{'faultCode': {'uniq': [3604, 4179, 2869, ... 57], 'type': 'factor’}}
<class 'list'>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-84-a877aa1b2642> in <module>()
7 print(d)
8
----> 9 json.dumps(d)
/home/shiny/anaconda3/lib/python3.4/json/__init__.py in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
228 cls is None and indent is None and separators is None and
229 default is None and not sort_keys and not kw):
--> 230 return _default_encoder.encode(obj)
231 if cls is None:
232 cls = JSONEncoder
/home/shiny/anaconda3/lib/python3.4/json/encoder.py in encode(self, o)
190 # exceptions aren't as detailed. The list call should be roughly
191 # equivalent to the PySequence_Fast that ''.join() would do.
--> 192 chunks = self.iterencode(o, _one_shot=True)
193 if not isinstance(chunks, (list, tuple)):
194 chunks = list(chunks)
/home/shiny/anaconda3/lib/python3.4/json/encoder.py in iterencode(self, o, _one_shot)
248 self.key_separator, self.item_separator, self.sort_keys,
249 self.skipkeys, _one_shot)
--> 250 return _iterencode(o, 0)
251
252 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
/home/shiny/anaconda3/lib/python3.4/json/encoder.py in default(self, o)
171
172 """
--> 173 raise TypeError(repr(o) + " is not JSON serializable")
174
175 def encode(self, o):
TypeError: 3604 is not JSON serializable
但是:
d = {}
d['model'] = {'cont': False, 'uniq': [1,2,3,4]}
json.dumps(d)
...效果很好.
推荐答案
json
模块缺乏灵活性引起的.该错误报告中有一个 体面的解决方法:
It looks like there is a bug in numpy
caused by a lack of flexibility in Python's json
module. There is a decent workaround in that bug report:
>>> import numpy, json
>>> def default(o):
... if isinstance(o, numpy.integer): return int(o)
... raise TypeError
...
>>> json.dumps({'value': numpy.int64(42)}, default=default)
'{"value": 42}'
本质上,json.dumps()
采用一个default
参数:
Essentially, json.dumps()
takes a default
argument:
default(obj)是应返回 obj 的可序列化版本或提高
TypeError
的函数.默认值仅引发TypeError
.
default(obj) is a function that should return a serializable version of obj or raise
TypeError
. The default simply raisesTypeError
.
发布的解决方法刚刚将一个函数传递给json.dumps()
,该函数将numpy.integer
的值转换为int
.
The workaround posted just passed a function to json.dumps()
that converts numpy.integer
values to int
.
这篇关于列表作为JSON不可序列化的dict中的条目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!