如何修改flatten_data函数解析字符串内的JSON消息?
问题
现有以下Python扁平化函数flatten_data:
def flatten_data(json_data): """ Arguments: json_data (dict): json data Returns: dict : {a:1, b:2, b_c:1, b_d:2} """ out = {} def flatten(x, name=''): if type(x) is dict: for a in x: flatten(x[a], name + a + '_') elif type(x) is list: out[name[:-1]] = x else: out[name[:-1]] = x flatten(json_data) return out
传入如下JSON格式的输入数据时:
{ "id": "123", "name": "Jack", "createdAt": 20221212, "region": '{"country": "USA", "city": "NewYork"}' }
需要得到如下扁平化后的输出结果:
{ "id": "123", "name": "Jack", "createdAt": 20221212, "region_country": "USA", "region_city": "NewYork" }
请问应当如何修改该flatten_data函数,以实现将字符串形式的嵌套JSON也进行扁平化处理?
解决方案
要实现字符串形式嵌套JSON的扁平化,需要在函数中加入字符串JSON解析逻辑,尝试将符合JSON格式的字符串转为字典后再递归处理,同时兼容普通字符串的情况。修改后的函数如下:
import json def flatten_data(json_data): """ Arguments: json_data (dict): json data Returns: dict : {a:1, b:2, b_c:1, b_d:2} """ out = {} def flatten(x, name=''): # 先尝试解析字符串形式的JSON if isinstance(x, str): try: # 替换单引号为双引号,符合JSON标准格式 parsed = json.loads(x.replace("'", "\"")) flatten(parsed, name) return except (json.JSONDecodeError, ValueError): # 解析失败,说明是普通字符串,继续后续流程 pass if isinstance(x, dict): for a in x: flatten(x[a], name + a + '_') elif isinstance(x, list): out[name[:-1]] = x else: out[name[:-1]] = x flatten(json_data) return out
关键修改点
- 导入
json模块用于解析字符串JSON; - 在
flatten函数开头增加字符串处理分支:对字符串尝试JSON解析,成功则递归处理解析后的字典,失败则按普通字符串存入结果; - 处理输入中用单引号包裹的JSON字符串,先替换为双引号以符合JSON标准格式;
- 将原有的
type(x) is dict改为isinstance(x, dict),类型判断更灵活,支持子类场景。
内容的提问来源于stack exchange,提问作者Ugur Selim Ozen
相关产品推荐
相关产品推荐

