카테고리 없음

[파이썬] 파이썬 십진수를 깊게 중첩되고 예측할 수없는 목록의 문자열로 변환

행복을전해요 2021. 2. 24. 12:36

매개 변수를 사용 Decimal하는 동안 변환하려면 :json.dump()default

import json
import sys
from decimal import Decimal

def default(obj):
    if isinstance(obj, Decimal):
            return str(obj)
                else:
                        raise TypeError(obj)
                        
                        # convert during dump
                        json.dump(data, sys.stdout, indent=2, default=default)
                        

data내부 수정하기 :

import json
import sys
from collections import MutableMapping, MutableSequence
from decimal import Decimal

def convert_decimal(json_data):
    stack = [json_data]
        while stack:
                json_data = stack.pop()
                        if isinstance(json_data, MutableMapping): # json object
                                    it = json_data.items()
                                            elif isinstance(json_data, MutableSequence): # json array
                                                        it = enumerate(json_data)
                                                                else: # scalar data
                                                                            continue
                                                                            
                                                                                    for k, v in it:
                                                                                                if isinstance(v, Decimal):
                                                                                                                json_data[k] = str(v)
                                                                                                                            else:
                                                                                                                                            stack.append(v)
                                                                                                                                            
                                                                                                                                            
                                                                                                                                            # convert inplace
                                                                                                                                            convert_decimal(data)
                                                                                                                                            json.dump(data, sys.stdout, indent=2)
                                                                                                                                            

두 스크립트 모두 동일한 출력을 생성합니다.

[
  {
      "Payments": {
            "OtherFees": "0", 
                  "APR": "2.54", 
                        "Rate": "0.0254", 
                              "IsCapped": true, 
                                    "Name": "TestData", 
                                          "Program": {
                                                  "Description": null, 
                                                          "ProgramName": "AST"
                                                                }, 
                                                                      "AppliedIds": [], 
                                                                            "CapCostTotal": "27900", 
                                                                                  "Tax": "0", 
                                                                                        "Payment": "495.64"
                                                                                            }
                                                                                              }
                                                                                              ]
                                                                                              

일반 함수convert_decimal() 를 사용하면 단순화 할 수 있습니다 .get_items()

def convert_decimal(json_data):
    stack = [json_data]
        while stack:
                json_data = stack.pop()
                        for k, v in get_items(json_data):
                                    if isinstance(v, Decimal):
                                                    json_data[k] = str(v)
                                                                else:
                                                                                stack.append(v)
                                                                                
-------------------

십진수를 문자열로 변환하고 싶지만 목록의 내용과 사전의 값에 함수를 재귀 적으로 적용하고 그렇지 않으면 변경되지 않은 객체를 반환합니까? 그런 다음 다음을 수행하십시오.

def strip_decimals(o):
    if type(o) == Decimal:
            return str(o)
                elif type(o) == list:
                        return map(strip_decimals, o)
                            elif type(o) == dict:
                                    return dict([(k, strip_decimals(v)) for k, v in o.iteritems()])
                                        else:
                                                return o
                                                

결과 :

[{'Payments': {'APR': '2.54',
           'AppliedIds': [],
                      'CapCostTotal': '27900',
                                 'IsCapped': True,
                                            'Name': 'TestData',
                                                       'OtherFees': '0',
                                                                  'Payment': '495.64',
                                                                             'Program': {'Description': None, 'ProgramName': u'AST'},
                                                                                        'Rate': '0.0254',
                                                                                                   'Tax': '0'}}]
                                                                                                   


출처
https://stackoverflow.com/questions/22080079