如何将特定格式的字典字符串转换为目标嵌套JSON格式
问题描述
我有一段格式如下的字符串:
{from:[3,4],to:[7,4],color:2},{from:[3,6],to:[10,6],color:3},{from:[5,8],to:[9,8],color:5},{from:[5,11],to:[10,11],color:6},{from:[1,0],to:[1,11],color:0},{from:[10,1],to:[10,6],color:4},{from:[3,0],to:[8,0],color: 1}
希望将其转换为嵌套层级的JSON格式。目前使用以下Python代码处理后:
def select(value): ll = value.split(',{') ll = [element.replace("{", '') for element in ll] ll = [element.replace("}", '') for element in ll] js = {str(i):letter for i,letter in enumerate(ll)} js = json.dumps(js) return js total["data_words_selection"] = total["data_words_selection"].map(lambda x: str(x).lstrip("['").rstrip("']")).astype(str) total['data_words_selection'] = total['data_words_selection'].apply(select)
得到的结果是键为索引、值为字符串的JSON:
{ "0": "from:[3,4],to:[7,4],color:2", "1": "from:[3,6],to:[10,6],color:3", "2": "from:[5,8],to:[9,8],color:5", "3": "from:[5,11],to:[10,11],color:6", "4": "from:[1,0],to:[1,11],color:0", "5": "from:[10,1],to:[10,6],color:4", "6": "from:[3,0],to:[8,0],color:1" }
但我需要将其转换为如下嵌套层级的JSON格式(手写字样,可能存在格式错误):
{ "0": "from": "0": "3" "1": "4" "to": "0": "7" "1": "4" "color": "2" "1": "from": "0": "3" "1": "6" "to": "0": "10" "1": "5" "color": "3" }
需要实现该转换。
解决方案
你需要修改select函数,将每个条目里的from、to数组解析为键为索引的对象,同时把color转为字符串,最终构建嵌套的字典结构后再转JSON。以下是修改后的完整代码:
import json import re def parse_entry(entry_str): # 解析单个条目(如"from:[3,4],to:[7,4],color:2") entry = {} # 用正则匹配每个键值对,处理数组和普通值 pattern = r'(\w+):(\[.*?\]|\d+)' matches = re.findall(pattern, entry_str) for key, value in matches: if value.startswith('[') and value.endswith(']'): # 处理数组,转为{0: "3", 1: "4"}格式 nums = value.strip('[]').split(',') entry[key] = {str(i): num.strip() for i, num in enumerate(nums)} else: # 处理color值,转为字符串 entry[key] = value.strip() return entry def select(value): # 拆分原始字符串为单个条目 ll = value.split(',{') ll = [element.replace("{", "").replace("}", "").strip() for element in ll] # 逐个解析条目,构建嵌套字典 result = {} for i, entry_str in enumerate(ll): result[str(i)] = parse_entry(entry_str) # 转为格式化的JSON字符串 return json.dumps(result, indent=4) # 后续处理DataFrame的代码保持不变 total["data_words_selection"] = total["data_words_selection"].map(lambda x: str(x).lstrip("['").rstrip("']")).astype(str) total['data_words_selection'] = total['data_words_selection'].apply(select)
代码说明
parse_entry函数:负责解析单个条目字符串,用正则表达式提取键值对:- 遇到数组格式(如
[3,4]),拆分为元素后转为键为0、1的字典; - 遇到普通数值(如
2),直接转为字符串存入字典。
- 遇到数组格式(如
select函数:- 拆分原始字符串得到每个条目;
- 遍历条目,调用
parse_entry解析为嵌套字典; - 用
json.dumps生成带缩进的格式化JSON,保证可读性。
执行后得到的JSON格式如下(符合你的需求):
{ "0": { "from": { "0": "3", "1": "4" }, "to": { "0": "7", "1": "4" }, "color": "2" }, "1": { "from": { "0": "3", "1": "6" }, "to": { "0": "10", "1": "6" }, "color": "3" }, // ... 其他条目省略 }
内容的提问来源于stack exchange,提问作者skrtsway
相关产品推荐
相关产品推荐

