Files
2024-09-27 01:15:47 +08:00

201 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# JsonToClassOrInterface
## 状态
持续开发中...
- 【完成】~~1: 将开发桌面端软件 和 web网页 进而 方便作为 独立的 工具来使用。~~
- 【完成】~~2: 增加功能,将生成的 Interface 和 class 自动生成 xxx.ts 文件,并保存到你给的项目路径中,方便开发者将本插件和项目请求进行深度集成~~
**基于本插件自己开发的支持MACLinuxWindows 的桌面端项目地址:**
> [https://gitee.com/bmycode/json-class-desktop](https://gitee.com/bmycode/json-class-desktop)
## 前言
顾名思义,这是一个把前端接口的`json`数据转化为 `typescript``Interface``Class`的插件。
当你在用`typescript`开发项目,你是否烦恼过后端接口给我们一坨`json`数据的时候,我们需要为数据 **手动编写大量**`Interface``Class`,来为请求中间层的方法标注返回类型,然后才能在页面中使用并获得优雅的类型提示
**手动写...很麻烦的,为何不 根据 json 数据自动生成???!!!**
受到 [flutter](https://flutter.dev/) 的 [json to dart](https://javiercbk.github.io/json_to_dart/) 启发,进而开发本插件。
## 注意
**本插件只能将json自动生成为 `Interface` 或 `Class`,避免我们手动编写的繁杂过程,但并不能实现类似 flutter json_serializable 将 json数据和类进行映射序列化的功能**
如果你想实现全套 json_serializable 的功能,可以在调用 `toClass` 方法的时候将参数 `needProperty` 开启并设置为`true`(参数说明看下面)。
这时候将生成 `json-mapper-class` 插件所需要的 **序列化代码**
---
至于为什么需要 `json-mapper-class` 这个插件,相信开发过`flutter`的你应该很清楚,不清楚去看官网说的说明:
> [https://docs.flutter.dev/data-and-backend/serialization/json](https://docs.flutter.dev/data-and-backend/serialization/json)
---
如果你需要使用`json和类映射`,那么要在项目里下载引入本插件才能使用,插件地址:
> [json-mapper-class](https://www.npmjs.com/package/json-mapper-class)
---
可能你会疑惑甚至一脸懵逼,我知道你很急,但是你先别着急,看说明你思考下就明白了:
插件有两个:
- json-class-interface
- json-mapper-class
它们之间的使用关系举例说明如下:
- 假设 http://www.xxx.com/newsInfo 接口返回了 **新闻详情数据**
- 这时我们 使用插件 `json-class-interface` 将接口返回数据转为 类(needProperty参数需要开启),然后将 插件返回的代码复制保存到 xxx.ts 中。
- 最后 使用插件 `json-mapper-class` 将上一步的类和接口json传入本插件会自动序列化json存储到类中**请求中间层方法返回数据类型和页面上直接 使用 类 即可**
**当然你也可以把这两个插件和你的项目进行深度的集成,让它们更加`自动化`,`无感`,`便捷`,`高效`。**
## 安装
> npm i --save json-class-interface
## 使用案例
```typescript
import { toClass, toInterface } from "json-class-interface";
// Json 数据
let json1 = {
status: 200,
message: "请求成功",
result_list: [
{
id: 1,
name: "新闻1",
tags_arr: [
{
tags_id: 1,
tags_title: '标签标题1'
},
{
tags_id: 1,
tags_title: '标签标题1'
}
]
},
{
id: 2,
name: "新闻2",
tags_arr: [
{
tags_id: 1,
tags_title: '标签标题2'
},
{
tags_id: 1,
tags_title: '标签标题2'
}
]
},
]
}
// 1 转换为 Class
// JsonToClass: 第一层类的名称,随便自定义
let type: string = toClass("JsonToClass", json1)
console.log(type);
// json转换为class的结果输出
// export class TagsArr {
// tags_id!: number;
// tags_title!: string;
// }
// export class ResultList {
// id!: number;
// name!: string;
// tags_arr!: TagsArr[];
// }
// export class JsonToClass {
// status!: number;
// message!: string;
// result_list!: ResultList[];
// }
// 2 转化为 Interface
let Interface: string = toInterface("JsonToInterface", json1)
console.log(Interface);
// json转换为Interface的结果输出
// export interface TagsArr {
// tags_id: number;
// tags_title: string;
// }
// export interface ResultList {
// id: number;
// name: string;
// tags_arr: TagsArr[];
// }
// export interface JsonToInterface {
// status: number;
// message: string;
// result_list: ResultList[];
// }
```
# 方法
`json` 数据转化为 `class`
## toClass(className: string = "JsonToClass", rawJson: JosnType | string, options: ToClassOptions = {}): string
---
`json` 数据转化为 `interface`,本方法的效果 和 `toClass` 参数 `interfaceModel: true` 效果一样。为了方便使用,故提供`toInterface`方法
## toInterface(className: string = "JsonToInterface", rawJson: JosnType | string, options: ToClassOptions = {}): string
---
方法参数说明:
| 名称 | 类型 | 默认值 |
| :-----:| :----: | :----: |
| className | string | JsonToClass 或 JsonToInterface |
| rawJson | JosnType 或 string | 不为空 |
| options | ToClassOptions | {} |
**JosnType 类型如下:**
```
export type JosnType = { [key: string]: any };
```
**ToClassOptions 类型如下:**
```
export interface ToClassOptions {
nullAlias?: string;
needProperty?: boolean;
needPropertyValue?: boolean;
interfaceModel?: boolean
}
```
| 名称 | 类型 | 默认值 | 说明 |
| :----:| :----:|:----:|:----:|
| nullAlias | string | "string" | 如果对象值为null转化为 class 或 interface 时候给这个对象key个默认类型 |
| needProperty | boolean | false | 是否需要生成Property装饰器用到插件 json-mapper-class 才需要开启 |
| needPropertyValue | boolean| false | 是否需要生成Property装饰器的默认值用到插件 json-mapper-class 才需要开启|
| interfaceModel | boolean| false | 是否需要生成 interface 模式 |