2015-09-08 44 views
1

我需要保存一個列表(或一個numpy數組)作爲JSON文件中的條目之一。我得到了「不JSON序列化」的錯誤,我不知道如何解決它(以及爲什麼我沒有得到它,當我手動傳遞一個列表字典)。列表作爲一個字典不是JSON序列化

我的代碼:

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) 

...工作正常。

+0

什麼是print type(d ['faultCode'] ['uniq'] [0])'?這是說'3604'不是可序列化的,不是列表。 – Sam

+0

這是。我需要將它轉換爲float/int嗎? –

回答

2

它看起來像有一個bug in numpy caused by a lack of flexibility in Python's json module。存在這樣的bug報告decent workaround

>>> 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參數:

默認(OBJ)是應返回的OBJ或序列化版本的功能提高TypeError。默認值簡單提高TypeError

解決方法公佈剛剛通過一個函數來json.dumps()numpy.integer值轉換爲int

+0

謝謝,現在工作! –

相關問題