如何验证并提取含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
相关产品推荐
相关产品推荐

