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

如何将特定格式的字典字符串转换为目标嵌套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)

代码说明

  1. parse_entry函数:负责解析单个条目字符串,用正则表达式提取键值对:
    • 遇到数组格式(如[3,4]),拆分为元素后转为键为0、1的字典;
    • 遇到普通数值(如2),直接转为字符串存入字典。
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:10:13