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

如何解析含动态键的JSON以实现对象模糊搜索测试?

动态键JSON的测试解析方案

问题描述

我有一段结构如下的JSON数据,其中accounts、deposites、cards下的对象名称是动态生成的(依赖客户端ID)。我需要实现类似“CFT - Piggy_Bank测试”的用例:当响应中存在至少一个entitySubSystems为CFT且entityType为PIGGY_BANK的账户时,测试通过。之前尝试用forEach方法未成功,想知道正确的解析方式,以及这种测试是否可行。

JSON数据示例:

{
    "accounts": {
        "7-PIGGY_BANK-2739": {
            "timestamp": "2023-07-11T14:08:23.327",
            "state": "PRODUCT_ACTUAL",
            "entitySubSystems": "CFT",
            "number": "2739",
            "entityType": "PIGGY_BANK",
            "entityId": "2739",
            "entityLocalId": "2739"
        },
        "17-CREDIT_CARD_ACCOUNT-1687": {
            "timestamp": "2023-07-11T14:08:22.81",
            "state": "PRODUCT_ACTUAL",
            "entitySubSystems": "OPENW",
            "number": "1687",
            "entityType": "CREDIT_CARD_ACCOUNT",
            "entityId": "1687",
            "entityLocalId": "1687"
        }

    },
    "deposites": {
        "7-DEPOSIT-0495": {
            "timestamp": "2023-07-11T14:08:23.327",
            "state": "PRODUCT_ACTUAL",
            "entitySubSystems": "CFT",
            "number": "0495",
            "entityType": "DEPOSIT",
            "entityId": "4495",
            "entityLocalId": "20495"
        }
    },
    "cards": {
        "17-DEBET_CARD-07820": {
            "timestamp": "2023-07-11T14:08:22.809",
            "state": "PRODUCT_ACTUAL",
            "entitySubSystems": "OPENW",
            "number": "07820",
            "entityType": "DEBET_CARD",
            "entityId": "40367",
            "entityLocalId": "07820"
        }
    }
}

可行的解析与测试方案

这种测试完全可行,核心思路是跳过动态键,直接提取对象的值进行条件判断,推荐使用Object.values()配合some()方法,比forEach更适合这类存在性验证场景。

1. 单模块验证(仅检查accounts)

先提取accounts下的所有账户对象,再用some()判断是否存在符合条件的项:

// 假设response是你获取到的JSON数据
const targetExists = Object.values(response.accounts).some(account => {
  return account.entitySubSystems === 'CFT' && account.entityType === 'PIGGY_BANK';
});

// 测试断言示例(以Mocha+Chai为例)
expect(targetExists).to.be.true;

2. 多模块全局验证(检查所有模块)

如果需要在accounts、deposites、cards中全局查找符合条件的实体,可以合并所有模块的值后再判断:

// 合并所有模块的实体对象为一个数组
const allEntities = [
  ...Object.values(response.accounts),
  ...Object.values(response.deposites),
  ...Object.values(response.cards)
];

// 验证是否存在目标实体
const targetExists = allEntities.some(entity => {
  return entity.entitySubSystems === 'CFT' && entity.entityType === 'PIGGY_BANK';
});

// 测试断言
expect(targetExists).to.be.true;

为什么forEach没成功?

forEach只是遍历数组执行回调,没有返回值,无法直接告知是否找到符合条件的项。你需要额外设置一个外部变量来标记是否找到,而some()会在找到第一个符合条件的元素后立即停止遍历,直接返回布尔值,更简洁高效。

内容的提问来源于stack exchange,提问作者Igor Martakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:23:04