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
相关产品推荐
相关产品推荐

