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]
问题原因分析
- 原始值未被转换存储:只重写了
__getitem__和get方法,但使用{**exampleDict}.values()或直接访问values()时,取的是字典中存储的原始值,并未经过转换逻辑。 - get方法存在bug:处理嵌套字典时变量名写错(
values_to_string未定义就赋值),且未递归处理深层嵌套的字典,导致内部int值无法转换。 - 赋值时未处理嵌套结构:直接把原始的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
相关产品推荐
相关产品推荐

