JSON 数据中,要将 value 转成特定的值,如何优雅的转换

2023-01-06 00:31:00 +08:00
 Ranni

比如有个这样的 response

{
    "examinationStatus":{
        "absent":false,
        "noAbsent":true
    },
    "grades":{
        "math":90
    }
}

然后我要返回的数据类型是这样的

{
    "isAbsent":false,
    "grades":{
        "math":"优秀"
    }
}

现在小组里的代码是将第一个 Json String 转成 map ,然后一堆 if 判断,将值塞到一个对象里去,一百多行了,看起来真的难受,想请教下有没有没有比较好的优化方案

4237 次点击
所在节点    程序员
26 条回复
Ranni
2023-01-06 23:45:04 +08:00
@ddvswgg 谢谢大佬这么详细的回复,这种 hard code 是一种方案,但是我自己想要的是,在业务方法里尽可能少的代码,想用某种设计模式,把这些处理塞到某个 vo 类,暂时想到的是用建造者模式,将转换的逻辑塞到 build 里
Nnq
2023-01-08 07:28:48 +08:00
"isAbsent":false 你是认真的么? 好像阿里的最佳实践里也提到不要这么写吧
forward
2023-01-08 12:14:13 +08:00
这种事就交给前端吧,后端返回 “优秀” 这个中文不太好的,我写过一个 npm 包,很优雅~~
硬要在后端转,估计也有类似的包,没有就自己写一个
https://www.npmjs.com/package/class-converter

import { property, typed, deserialize, toClass, toPlain } from 'class-convert';

class GradesModel {
@deserialize(val => (val >= 90 ? '优秀' : '普通'))
@property()
math: string;
}

class JsonResponse {
@deserialize(val => val.absent)
@property('examinationStatus')
isAbsent: boolean;

@typed(GradesModel)
@property()
grades: GradesModel;
}

const model = toClass(
{
examinationStatus: {
absent: false,
noAbsent: true,
},
grades: {
math: 90,
},
},
JsonResponse,
);

// {"isAbsent":false,"grades":{"math":"优秀"}}
console.log(model);
lmshl
2023-01-08 15:38:40 +08:00
😏
Vaspike
2023-01-09 11:10:01 +08:00
@lmshl #24 Kotlin yyds
lmshl
2023-01-09 12:08:51 +08:00
@Vaspike kotlin 版随手写的,其实不安全,没有错误处理。按照生产级代码规范,应该多加 5 行的 data class 定义,做严格 ser/deser 。
同样的逻辑用 Scala 写会安全很多,Option/Either 签名的方法都是默认实现了,flatMap/getOrElse 过去就好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/906880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX