如何将特定字符串转换为符合指定结构的Valid JSON/YAML
解析JS风格字符串并转换为指定JSON结构
需求说明
原始输入字符串:
value = "{from:[3,4],to:[7,4],color:2},{from:[3,6],to:[10,6],color:3}"
需要将其转换为数组转带索引对象、所有值转为字符串的结构,目标格式如下(同时符合Valid JSON和Valid YAML规范):
{ "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" } }
修改后的Python脚本
import json import re value = "{from:[3,4],to:[7,4],color:2},{from:[3,6],to:[10,6],color:3}" def parse_json(value): arr = value.split("},") arr = [x+"}" for x in arr] arr[-1] = arr[-1][:-1] return json.dumps({str(i): process_item(add_quotation_marks(x)) for i, x in enumerate(arr)}, indent=2) def add_quotation_marks(value): # 给键名添加引号,转换为合法JSON格式 words = re.findall(r'(\w+:)', value) for word in words: value = value.replace(word[:-1], f'"{word[:-1]}"') return json.loads(value) def process_item(item): # 处理每个对象的属性值:数组转索引对象,所有值转字符串 processed = {} for key, val in item.items(): if isinstance(val, list): # 数组转成带索引的对象,值转字符串 processed[key] = {str(idx): str(element) for idx, element in enumerate(val)} else: # 单个值直接转字符串 processed[key] = str(val) return processed print(parse_json(value))
关键改动说明
- 新增
process_item函数:专门处理每个对象的属性值,完成两个核心转换:- 若值为数组,将其转换为以索引为键、元素转为字符串为值的对象
- 非数组值直接转为字符串
- 修改
parse_json函数:在原有解析基础上,调用process_item处理每个解析后的对象,确保输出符合要求 - 添加
indent=2到json.dumps:让输出的JSON格式更易读,和目标格式一致
内容的提问来源于stack exchange,提问作者skrtsway
相关产品推荐
相关产品推荐

