JSON 数据中,要将 value 转成特定的值,如何优雅的转换
比如有个这样的 response
{
"examinationStatus":{
"absent":false,
"noAbsent":true
},
"grades":{
"math":90
}
}
然后我要返回的数据类型是这样的
{
"isAbsent":false,
"grades":{
"math":"优秀"
}
}
现在小组里的代码是将第一个 Json String 转成 map ,然后一堆 if 判断,将值塞到一个对象里去,一百多行了,看起来真的难受,想请教下有没有没有比较好的优化方案
你啥语言,我用 js 写的话没几行。。就直接写,你不会是 java 吧
Java 开发者:虽然不知道为什么,我先在这里放上一个 class ;
JS 开发者:虽然忘了怎么写的,不过已经写完了,反正没报错;
既然前端那么好处理,那就交给前端做。。。
如果字段是固定的 java 的话就建两个 class 呗
def conversion(input_data):
dict_grades = {
"isAbsent":None,
"grades":{}
}
# attendance
if input_data'examinationStatus':
dict_grades['isAbsent'] = True
else:
dict_grades['isAbsent'] = False
# grades
for subject, score in input_data['grades'].items():
if score >= 90:
dict_grades'grades' = '优秀'
else:
dict_grades'grades' = '垃圾'
return dict_grades
input_data = {
"examinationStatus":{
"absent":False,
"noAbsent":True
},
"grades":{
"math":90,
'english':50
}
}
output_data = {'isAbsent': False, 'grades': {'math': '优秀', 'english': '垃圾'}}
这是你想要的么?
JsonPath ?
看这描述好像是 Java 。。。
jsonpath 判断值,class 类转换,map 火葬场
写一个工具,也不用多少时间吧,有时间写个 Demo 。先说个思路,有个抽象的规则处理类,存取目标 jsonpath 和要删除 jsonpath ,还有替换成的 jsonpath 和对应的 value 等等。然后写各个实现,用个 list 存取各个规则实现的实例,遍历处理
map 做值映射,然后遍历替换?
jmespath.org/
写两个函数的事,get 、set
什么 class 不 class 的,map 一把梭,两行代码搞定
如果 "90" => "优秀" 是固定的,那么直接做字符串替换就行了?
jq?
def grade(score): if score >= 90 then "优秀" else "不合格" end; {isAbsent: .examinationStatus.absent, grades: { math: grade(.grades.math) }}
for (let i=80;i<=100;i++) {
let reg = ${i}
json = json.replaceAll(reg, '优秀')
}
直接正则替换? 伪代码
JsonPath
这完全是两种不同的结构,加两个类吧
如果你要动态转换可以参考这个方案: docs.oracle.com/cd/E29542_01/doc.1111/e26693/dc_intro.htm#WCCAA2894
如果你想的是静态转换直接使用 MapStruct
(source="source.examinationStatus.absent",target="isAbsent")
Target convert(Source souce)
不好意思,忘记说了是 Java
谢谢,我看看这两方案
谢谢大佬这么详细的回复,这种 hard code 是一种方案,但是我自己想要的是,在业务方法里尽可能少的代码,想用某种设计模式,把这些处理塞到某个 vo 类,暂时想到的是用建造者模式,将转换的逻辑塞到 build 里
"isAbsent":false 你是认真的么? 好像阿里的最佳实践里也提到不要这么写吧
这种事就交给前端吧,后端返回 “优秀” 这个中文不太好的,我写过一个 npm 包,很优雅~~
硬要在后端转,估计也有类似的包,没有就自己写一个
www.npmjs.com/package/class-converter
import { property, typed, deserialize, toClass, toPlain } from 'class-convert';
class GradesModel {
(val => (val >= 90 ? '优秀' : '普通'))
()
math: string;
}
class JsonResponse {
(val => val.absent)
('examinationStatus')
isAbsent: boolean;
(GradesModel)
()
grades: GradesModel;
}
const model = toClass(
{
examinationStatus: {
absent: false,
noAbsent: true,
},
grades: {
math: 90,
},
},
JsonResponse,
);
// {"isAbsent":false,"grades":{"math":"优秀"}}
console.log(model);
😏
哈哈哈,我也收到了。一连收到四封 ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApwAAABOCAYAAACNIs…
K40 PixelExperience 版本 12 第一版已推出,有哪位大哥试水 感觉 lineageos 比 pe 要稳定一些, 当然尝鲜的话另说, 手上 k40 现在用的…
没在一线城市工作过,所以也没拿过高薪资,38 岁老程序员,技术栈比较老,主流框架会用但是经验不多,不过编程规范,程序健壮、开发经验肯定够(遇过的问题多啊),且带过项目做过管理,…