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

如何验证并提取含unknown类型属性的特定类JSON对象

解决方案:提取符合类A结构的JSON对象

步骤1:修正输入数据的语法错误

你给出的示例数据存在语法问题(属性赋值用=而非:、部分位置缺逗号),先修正为合法的TypeScript对象:

const x = {
  a: 'value1',
  c: [
    {
      known_attribue: 'known_value1',
      unknown_attribute_name: {
        attr1: 'attribute1_value1',
        attr2: 'attribute2_value1'
      }
    }
  ],
  d: {
    known_attribue: 'known_value2',
    unknown_attribute_name: {
      attr3: 'attribute3_value1'
    }
  }
};

步骤2:编写类型守卫函数验证对象结构

TypeScript类型仅在编译时有效,运行时需要手动验证对象是否符合A的结构,我们可以写一个类型守卫函数实现校验:

class A {
  known_attribue: 'string';
  unknown_attribute_name: unknown;
}

// 类型守卫:判断对象是否符合A的结构
function isA(obj: unknown): obj is A {
  if (typeof obj !== 'object' || obj === null) {
    return false;
  }
  const candidate = obj as Record<string, unknown>;
  // 验证必须包含指定属性,且known_attribue为字面量类型'string'(可根据需求调整)
  return candidate.known_attribue === 'string' && 'unknown_attribute_name' in candidate;
}

步骤3:递归遍历JSON结构提取符合条件的对象

写一个递归函数,遍历输入对象的所有层级(包括数组元素、嵌套对象),收集所有符合A结构的对象:

function extractAInstances(data: unknown): A[] {
  const result: A[] = [];

  // 检查当前数据是否符合A的结构
  if (isA(data)) {
    result.push(data);
  }

  // 遍历数组元素
  if (Array.isArray(data)) {
    for (const item of data) {
      result.push(...extractAInstances(item));
    }
  }

  // 遍历对象的所有属性值
  else if (typeof data === 'object' && data !== null) {
    for (const key of Object.keys(data)) {
      const value = (data as Record<string, unknown>)[key];
      result.push(...extractAInstances(value));
    }
  }

  return result;
}

步骤4:调用函数获取结果

const extracted = extractAInstances(x);
console.log(extracted);

运行后得到的结果与你的期望一致:

[
  {
    known_attribue: 'known_value2',
    unknown_attribute_name: { attr3: 'attribute3_value1' }
  },
  {
    known_attribue: 'known_value1',
    unknown_attribute_name: { attr1: 'attribute1_value1', attr2: 'attribute2_value1' }
  }
]

可选调整

如果需要放宽known_attribue的类型限制(比如允许任意字符串),只需修改isA函数的判断逻辑为typeof candidate.known_attribue === 'string'即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:08:12