You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python自定义字典类转换所有值为str失败,求解决方法

问题:自定义字典类未将int值全部转为str,导致formdata数据类型不符合要求

我写了一个类方法,想把字典里的所有值转成str类型,方便作为post数据放到formdata里,但部分int类型的值没成功转换。

示例输入数据:

jsonData={
   "LanguageId":1,
   "ClientTypeId":2,
   "BrandId":3,
   "JurisdictionId":1,
   "ClientIntegratorId":1,
   "ExternalIds":[10372246,10372249,10372236,10372239,10372234,10372235,10372231,10372233,10377244,10377245,10377254,10377247,10377251,10377248,10377249,10377246
   ],
   "MarketCName":"win-draw-win",
   "ScoreboardRequest":{
      "ScoreboardType":3,
      "IncidentRequest":{}
   },
   "BrowserId":2,
   "OsId":4,
   "ApplicationVersion":"",
   "BrowserVersion":"15.4",
   "OsVersion":"10.15.7",
   "SessionId":'null',
   "TerritoryId":227,
   "CorrelationId":"71a5a843-a9cd-4152-9ef5-cede7ee59e33",
   "VisitId":"b0d95dbe-fc0c-482a-a45c-1e300c8682b9",
   "ViewName":"sports",
   "JourneyId":"77057d08-5dff-4da4-afd7-087b97024194"
}

自定义的字典类:

class StringDict(dict):
    def __init__(self):
        dict.__init__(self)
        
    def __getitem__(self, y):
        value_to_string = str(dict.__getitem__(self, y))
        return value_to_string
    
    def get(self, y):
        if isinstance(dict.get(self, y), list):
            value_to_string = [str(x) for x in dict.get(self, y)]
            
        elif isinstance(dict.get(self, y), dict):
            value_to_string = {}
            for keys, values in dict.get(self, y).items():
                if isinstance(values, dict):
                    values_to_string[keys] = values
                values_to_string[keys] = str(values)
                
        elif isinstance(dict.get(self, y), int) or isinstance(dict.get(self, y), float):
            value_to_string = str(dict.get(self, y))
        else:
            value_to_string = str(dict.get(self, y))
        return value_to_string

exampleDict = StringDict()

测试代码及结果:

for key, values in jsonData.items():
    exampleDict[key] = values
[type(x) for x in {**exampleDict}.values()]

# 输出结果
[int,
 int,
 int,
 int,
 int,
 list,
 str,
 dict,
 int,
 int,
 str,
 str,
 str,
 str,
 int,
 str,
 str,
 str,
 str]

预期结果:所有值的类型应为str、list或dict,且list和dict内部的所有值也都是str:

[str,
 str,
 str,
 str,
 str,
 list,
 str,
 dict,
 str,
 str,
 str,
 str,
 str,
 str,
 str,
 str,
 str,
 str,
 str]

问题原因分析

  1. 原始值未被转换存储:只重写了__getitem__和get方法,但使用{**exampleDict}.values()或直接访问values()时,取的是字典中存储的原始值,并未经过转换逻辑。
  2. get方法存在bug:处理嵌套字典时变量名写错(values_to_string未定义就赋值),且未递归处理深层嵌套的字典,导致内部int值无法转换。
  3. 赋值时未处理嵌套结构:直接把原始的list、dict赋值到StringDict中,嵌套结构里的int值完全没被处理。

解决方案

方案1:重写__setitem__,赋值时自动转换所有值

修改StringDict类,在赋值阶段就把所有值(包括嵌套结构里的)转换成目标类型:

class StringDict(dict):
    def _convert_value(self, value):
        if isinstance(value, (int, float)):
            return str(value)
        elif isinstance(value, list):
            return [self._convert_value(item) for item in value]
        elif isinstance(value, dict):
            nested_dict = StringDict()
            for k, v in value.items():
                nested_dict[k] = self._convert_value(v)
            return nested_dict
        else:
            return str(value)
    
    def __setitem__(self, key, value):
        converted_value = self._convert_value(value)
        super().__setitem__(key, converted_value)
    
    # 保持__getitem__和get方法兼容
    def __getitem__(self, key):
        return super().__getitem__(key)
    
    def get(self, key, default=None):
        return super().get(key, default)

exampleDict = StringDict()

测试代码及结果:

for key, values in jsonData.items():
    exampleDict[key] = values

# 检查顶层值类型
print([type(x) for x in exampleDict.values()])
# 输出:[str, str, str, str, str, list, str, StringDict, str, str, str, str, str, str, str, str, str, str, str]

# 检查list内部值类型
print([type(x) for x in exampleDict["ExternalIds"]])
# 输出:全是str类型

# 检查嵌套字典内部值类型
print(type(exampleDict["ScoreboardRequest"]["ScoreboardType"]))
# 输出:<class 'str'>

方案2:递归转换函数(无需自定义类)

如果不需要自定义字典类,也可以写一个递归函数直接转换整个数据结构:

def convert_to_string_structure(data):
    if isinstance(data, (int, float)):
        return str(data)
    elif isinstance(data, list):
        return [convert_to_string_structure(item) for item in data]
    elif isinstance(data, dict):
        return {k: convert_to_string_structure(v) for k, v in data.items()}
    else:
        return str(data)

# 使用方式
converted_data = convert_to_string_structure(jsonData)
print([type(x) for x in converted_data.values()])
# 输出符合预期,且嵌套结构内的值也都是str

内容的提问来源于stack exchange,提问作者Emil11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:35:23