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

使用DataWeave将同键对象转换为对象数组的最优方案

处理含重复"row"键JSON的最优转换方案

问题描述

输入的JSON存在重复的"row"键(数量可能多达数千个),常规JSON解析器会自动覆盖重复键,需要将其转换为以"rows"为键、对应值为数组的格式:
输入示例:

{
    "row":{
        "name": "abc"
    },
    "row":{
        "school": "pqr"
    }
}

期望输出:

{
    "rows":
    [
        {
            "name": "abc"
        },
        {
            "school": "pqr"
        }
    ]
}

核心思路

标准JSON规范不允许重复键,常规解析器会直接覆盖后续重复键的值,因此必须在解析阶段保留所有键值对,或直接处理原始JSON字符串,提取所有"row"对应的对象后重组结构。

分语言最优实现

Python 方案(推荐,支持复杂嵌套)

利用Python json模块的object_pairs_hook参数,直接获取原始键值对列表,过滤出所有"row"对应的值:

import json

def transform_duplicate_row(raw_json):
    # 加载所有键值对,保留原始顺序
    all_pairs = json.loads(raw_json, object_pairs_hook=list)
    rows = [value for key, value in all_pairs if key == "row"]
    return json.dumps({"rows": rows}, indent=2)

# 测试示例
input_json = '''{
    "row":{
        "name": "abc"
    },
    "row":{
        "school": "pqr"
    }
}'''
print(transform_duplicate_row(input_json))

该方案由JSON底层解析器处理原始数据,可靠性高,支持row值为嵌套对象的场景,性能适配数千条数据的规模。

JavaScript 方案

简单场景(row值无嵌套对象)

用正则匹配所有"row":{...}片段,提取对象后重组:

function transformDuplicateRowJson(rawJson) {
    const rowRegex = /"row":\s*({[^}]+})/g;
    const rows = [];
    let match;
    while ((match = rowRegex.exec(rawJson)) !== null) {
        rows.push(JSON.parse(match[1]));
    }
    return JSON.stringify({ rows }, null, 2);
}

// 测试示例
const inputJson = `{
    "row":{
        "name": "abc"
    },
    "row":{
        "school": "pqr"
    }
}`;
console.log(transformDuplicateRowJson(inputJson));
复杂场景(row值含嵌套)

正则无法处理嵌套结构,可实现简单的流式token解析器,逐字符读取并识别"row"键对应的对象边界,收集所有对象后重组,这种方式性能高效,适合大规模数据。

内容的提问来源于stack exchange,提问作者Mule-Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 06:35:17