NumPy array is not JSON serializable

2684 ワード

バックエンドアルゴリズムで処理した画像をdjangoでフロントエンドインタフェースに表示する過程で、バックエンドからフロントエンドへの伝送インタフェースは以下の通りである.
#インタフェース関数def post(request):if request.method='POST':#フォームをコミットするとdic={}#data={'name':“サーバが正常に動作します!”}クライアントのデータを返すif requestを参照するか否かを判断する.POST:#print(request.POST)#クライアントからのリクエスト内容を表示image_path = request.POST.get('a', 0)             #b = request.POST.get('b',0)#パラメータにa if image_が含まれているか否かを判断path :                 #res = add_args(a, b)                 image,result=main(image_path=image_path)                 if isinstance(image, np.ndarray):                      image=image.tolist()                 dic['result'] = image                 dic = json.dumps(dic)      #,cls=NumpyEncoder)                 return HttpResponse(dic)    #,JsonResponse(data)else:return HttpResponse('入力エラー!')else:return HttpResponse('入力が空')else:return HttpResponse('赤外線画像パスに入力してください!')
上の赤い部分のコードが間違っています:NumPy array is not JSON serializable
解決策、参考:https://stackoverflow.com/questions/26646362/numpy-array-is-not-json-serializable
import json
import numpy as np

class NumpyEncoder(json.JSONEncoder):
    """ Special json encoder for numpy types """
    def default(self, obj):
        if isinstance(obj, (np.int_, np.intc, np.intp, np.int8,
            np.int16, np.int32, np.int64, np.uint8,
            np.uint16, np.uint32, np.uint64)):
            return int(obj)
        elif isinstance(obj, (np.float_, np.float16, np.float32, 
            np.float64)):
            return float(obj)
        elif isinstance(obj,(np.ndarray,)): #### This is the fix
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

dumped = json.dumps(data, cls=NumpyEncoder)

with open(path, 'w') as f:
    json.dump(dumped, f)

上記の部分のコードに基づいて、元のコードを修正します.
#インタフェース関数def post(request):if request.method='POST':#フォームをコミットするとdic={}#data={'name':“サーバが正常に動作します!”}クライアントのデータを返すif requestを参照するか否かを判断する.POST:#print(request.POST)#クライアントからのリクエスト内容を表示image_path = request.POST.get('a', 0)             #b = request.POST.get('b',0)#パラメータにa if image_が含まれているか否かを判断path :                 #res = add_args(a, b)                 image,result=main(image_path=image_path)                 if isinstance(image, np.ndarray):                      image=image.tolist()                 dic['result'] = image                 dic = json.dumps(dic,cls=NumpyEncoder)#修正された部分!return HttpResponse(dic)#,JsonResponse(data)else:return HttpResponse('入力エラー!')else:return HttpResponse('入力が空')else:return HttpResponse('赤外線画像パスを入力してください!')