Python 将Excel输出转换为JSON drf

Python 将Excel输出转换为JSON drf,python,django,pandas,django-rest-framework,Python,Django,Pandas,Django Rest Framework,我有这个API。它返回Excel标题数据,我想将数据转储到JSON,但它显示了一个错误“ API代码: @api_view(['POST', ]) def bulkUploadPolicyMember(request): data = json.loads(request.data['data']) data = decode_data(data) data["uploaded_by"] = request.user.uid data['status'] = 0

我有这个API。它返回Excel标题数据,我想将数据转储到JSON,但它显示了一个错误“

API代码:

@api_view(['POST', ])
def bulkUploadPolicyMember(request):
    data = json.loads(request.data['data'])
    data = decode_data(data)
    data["uploaded_by"] = request.user.uid
    data['status'] = 0
    data['uploaded_date'] = datetime.datetime.now()
    data['sheet'] = data['sheet'] if 'sheet' in data and data['sheet'] != '' else None
    data['docket_id'] = data['docket_id'] if data['docket_id'] != '' else None
    if data['docket_id'] is None:
       return CustomeResponse(request=request, comment=DOCKET_REQUIRED, data=json.dumps({}, cls=UUIDEncoder),status=status.HTTP_400_BAD_REQUEST,validate_errors=1, message=DOCKET_REQUIRED)
    try:
       doc_obj = InwardDocument.objects.values('insurer_id').get(uid=data['docket_id'])
except InwardDocument.DoesNotExist:
    return CustomeResponse(request=request, comment=DOCKET_REQUIRED, data=json.dumps({}, cls=UUIDEncoder),status=status.HTTP_400_BAD_REQUEST,validate_errors=1, message=DOCKET_REQUIRED)
    policy_file_path = settings.BULK_POLICY_FILE_UPLOAD+'insurers/'+str(doc_obj['insurer_id'])
    try:
       if 'file' in request.FILES and request.FILES['file'] != "":
          policy_file = request.FILES['file']
          # check extension
          if validateFileExtension(policy_file) is True:
             if (getFileExtByFileName(policy_file) == 'xlsx' or getFileExtByFileName(policy_file) == 'xls') and data['sheet'] is None:
                return CustomeResponse(request=request, comment=SHEET_NAME_CHECK, message=SHEET_NAME_CHECK, data=json.dumps({}, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST,validate_errors=1)
            policy_file_name = file_save_by_source(request, policy_file_path, policy_file)
            if policy_file_name != "":
                data['file_name'] = policy_file_name
            else:
                return CustomeResponse(request=request, comment=COULD_NOT_UPLOAD_FILE, message=COULD_NOT_UPLOAD_FILE, data=json.dumps({}, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST,validate_errors=1)
            try:
                upload_path = settings.MEDIA_URL+policy_file_path+'/'+policy_file_name
                try:
                    pd_data = pd.read_excel(upload_path).columns                                         
                except Exception as e:
                    print(e)
                    return CustomeResponse(request=request, comment=BULK_DATA_NOT_FOUND,message=BULK_DATA_NOT_FOUND, data=json.dumps({}, cls=UUIDEncoder),status=status.HTTP_400_BAD_REQUEST,validate_errors=1)
            except Exception as e:
                #print(e)
                return CustomeResponse(request=request, log_data=json.dumps(str(e), cls=UUIDEncoder), message=SOMETHING_WENT_WRONG, data=json.dumps({}, cls=UUIDEncoder), status=status.HTTP_400_BAD_REQUEST, validate_errors=1)                                
        else:
            return CustomeResponse(request=request, comment=ALLOWED_POLICY_FILES, data=json.dumps({}, cls=UUIDEncoder),status=status.HTTP_400_BAD_REQUEST,validate_errors=1, message=ALLOWED_POLICY_FILES) 
    else:
        print("->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")

        return CustomeResponse(request=request, comment=POLICY_FILE_REQUIRED, data=json.dumps({}, cls=UUIDEncoder),status=status.HTTP_400_BAD_REQUEST,validate_errors=1, message=POLICY_FILE_REQUIRED)
except KeyError:
    return CustomeResponse(request=request, comment=KEY_MISSING,  message=KEY_MISSING, data=json.dumps({}, cls=UUIDEncoder),  status=status.HTTP_400_BAD_REQUEST,validate_errors=1)
else:
    return CustomeResponse(request=request, comment=FILE_SUCCESSFULLY_UPLOADED,message=FILE_SUCCESSFULLY_UPLOADED , data=json.dumps(pd_data, cls=UUIDEncoder),status=status.HTTP_200_OK,validate_errors=1)
输出如下所示:

Index(['PolicyName',  'Inclusion/Exclusion',
   'InsuredContactNo', 'IssueoffContactNo', 'PinCodeInsured',
   'PinCodeIssOffice', 'InsuredEmail', 'IssOfficeEmail', 'PDFLink',
   'Duplicate'],
  dtype='object')
错误是:

Object of type 'Index' is not JSON serializable
直接法 您可以在pandas
索引
对象上使用该方法。实际上,
列表
是可json序列化的

import json

json.dumps(pandas_index.tolist())
其中
pandas\u index
是问题中的
index
对象

自定义JSONEncoder方法 我可以看到您正在使用,因此您也可以编辑该类以匹配以下内容:

import json

from pandas.core.indexes.base import Index

class ExtendedJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Index): # add this condition
            return obj.tolist() # we are using the tolist method described above
        return super(ExtendedJSONEncoder, self).default(obj)