Конвертировать Pandas вывод Excel в JSON drf - PullRequest
0 голосов
/ 18 марта 2020

У меня есть этот API. Он возвращает данные заголовка Excel, и я хочу выгрузить данные Pandas в 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

1 Ответ

0 голосов
/ 08 апреля 2020

Простой метод

Вы можете использовать метод tolist для вашего pandas Index объекта. Действительно, list - это json сериализуемый.

import json

json.dumps(pandas_index.tolist())

Где pandas_index - это Index объект в вашем вопросе.

Пользовательский метод JSONEncoder

Я вижу, что вы используете параметр cls с json .dumps , поэтому вы также можете редактировать этот класс, чтобы он соответствовал следующему:

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