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

TypeScript中使用json2typescript反序列化无对象名JSON数组失败

问题描述

拥有一个无外层对象名的JSON数组,结构如下:

[
  {
    "FIRST_NAME": "fname",
    "LAST_NAME": "KSHHS",
    "SERIAL_NO": 905
  },
  {
    "FIRST_NAME": "jhdf",
    "LAST_NAME": "dfdf",
    "SERIAL_NO": 965
  }
]

需要在TypeScript中实现类似Java Jackson ObjectMapper的功能,将其反序列化为字段名不同的自定义Student类,类定义如下:

import { JsonObject, JsonProperty } from "json2typescript";

@JsonObject("Student")
export class Student {
    @JsonProperty('FIRST_NAME', String)
    firstName?: string;

    @JsonProperty('LAST_NAME', String)
    lastName?: string;

    @JsonProperty('SERIAL_NO', number)
    id?: string;
}

let response: Student[];
response = jsonConvert.deserializeArray(json , Student); // json为上述对象数组

使用json2typescript库反序列化后无报错,但日志显示生成了空的Student实例:

Receiving JSON array:[
  {
    "FIRST_NAME": "fname",
    "LAST_NAME": "KSHHS",
    "SERIAL_NO": 905
  },
  {
    "FIRST_NAME": "jhdf",
    "LAST_NAME": "dfdf",
    "SERIAL_NO": 965
  }]
----------
Receiving JSON object:
  {
    "FIRST_NAME": "jhdf",
    "LAST_NAME": "dfdf",
    "SERIAL_NO": 965
  }
Returning CLASS instance:
Student {}
----------
Returning array of CLASS instances:
[ Student {} ]
----------

如何解决反序列化失败的问题?

解决方案

1. 修复类型不匹配问题

Student类中id字段声明为string类型,但@JsonProperty中指定的类型是number,而JSON里的SERIAL_NO是数字类型,类型不匹配导致无法完成映射。需要将类型统一:

  • 若要直接映射数字类型,将id改为number,同时@JsonProperty的类型参数改为Number构造函数(装饰器需要传入构造函数而非TypeScript类型别名)。
  • 若需要将数字转为字符串,可自定义转换器处理。

2. 确保正确初始化JsonConvert实例

代码中使用了jsonConvert但未展示初始化逻辑,必须先创建实例并按需配置:

import { JsonConvert } from "json2typescript";

const jsonConvert = new JsonConvert();
// 可选配置:忽略JSON中未在类中定义的属性
jsonConvert.ignoreUnknownProperties = true;

3. 修正后的Student类示例

import { JsonObject, JsonProperty } from "json2typescript";

@JsonObject()
export class Student {
    @JsonProperty('FIRST_NAME', String)
    firstName?: string;

    @JsonProperty('LAST_NAME', String)
    lastName?: string;

    @JsonProperty('SERIAL_NO', Number)
    id?: number;
}

4. 正确调用反序列化方法

确保传入的json是合法的数组对象,再调用deserializeArray:

const json = [
    {"FIRST_NAME": "fname", "LAST_NAME": "KSHHS", "SERIAL_NO": 905},
    {"FIRST_NAME": "jhdf", "LAST_NAME": "dfdf", "SERIAL_NO": 965}
];

const response: Student[] = jsonConvert.deserializeArray(json, Student);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:21:31