TypeScript JsonProperty 注解

在 TypeScript 中,JsonProperty 注解是用于指定类属性与 JSON 字段之间的映射关系的装饰器。通过使用 JsonProperty 注解,我们可以方便地实现将 JSON 数据转换为 TypeScript 对象,或将 TypeScript 对象转换为 JSON 数据。

安装和导入

要使用 JsonProperty 注解,首先需要安装 reflect-metadataclass-transformer 两个库。

```shell
npm install reflect-metadata class-transformer

然后,我们需要在项目的入口文件中导入这两个库,并启用元数据的反射功能。

```typescript
import 'reflect-metadata';

基本用法

在 TypeScript 类的属性上使用 JsonProperty 注解,可以指定该属性与 JSON 字段之间的映射关系。例如,我们有一个名为 User 的类,并且想要将 name 属性映射为 JSON 中的 username 字段。

```typescript
import { JsonProperty } from 'class-transformer';

class User {
  @JsonProperty({ name: 'username' })
  name: string;
}

在上述示例中,我们使用 @JsonProperty({ name: 'username' })name 属性映射为 JSON 中的 username 字段。

嵌套对象

如果我们的类属性是一个嵌套对象,我们可以使用 @Type 注解来指定嵌套对象的类型。

```typescript
import { JsonProperty, Type } from 'class-transformer';

class Address {
  @JsonProperty({ name: 'street' })
  street: string;

  @JsonProperty({ name: 'city' })
  city: string;
}

class User {
  @JsonProperty({ name: 'name' })
  name: string;

  @JsonProperty({ name: 'address' })
  @Type(() => Address)
  address: Address;
}

在上述示例中,我们使用 @Type(() => Address)address 属性标记为 Address 类型。

数组属性

如果我们的类属性是一个数组,我们可以使用 @Type@Transform 注解来指定数组元素的类型和转换函数。

```typescript
import { JsonProperty, Type, Transform } from 'class-transformer';

class Product {
  @JsonProperty({ name: 'name' })
  name: string;

  @JsonProperty({ name: 'price' })
  @Transform((value) => parseFloat(value))
  price: number;
}

class Order {
  @JsonProperty({ name: 'id' })
  id: number;

  @JsonProperty({ name: 'products' })
  @Type(() => Product)
  products: Product[];
}

在上述示例中,我们使用 @Type(() => Product)products 属性标记为 Product 类型的数组。

转换为 JSON

要将 TypeScript 对象转换为 JSON 数据,我们可以使用 class-transformer 库中的 classToPlain 函数。

```typescript
import { classToPlain } from 'class-transformer';

const user = new User();
user.name = 'John Doe';

const json = classToPlain(user);
console.log(json);

输出结果为:

```json
{
  "name": "John Doe"
}

转换为对象

要将 JSON 数据转换为 TypeScript 对象,我们可以使用 class-transformer 库中的 plainToClass 函数。

```typescript
import { plainToClass } from 'class-transformer';

const json = {
  "name": "John Doe"
};

const user = plainToClass(User, json);
console.log(user);

输出结果为:

```typescript
User { name: 'John Doe', address: undefined }

总结

通过 JsonProperty 注解和 class-transformer 库,我们可以方便地实现 TypeScript 对象与 JSON 数据之间的转换。使用 JsonProperty 注解,我们可以指定类属性与 JSON 字段之间的映射关系,同时还可以处理嵌套对象和数组属性。希望本文对你理解和使用 JsonProperty 注解提供了帮助。

表格:

属性 描述
name JSON 中的字段名
@Type 指定属性的类型
@Transform 指定属性的转换函数,将属性的值进行转换
classToPlain 将 TypeScript 对象转换为 JSON 数据
plainToClass 将 JSON 数据转换为 TypeScript 对