比如有个这样的 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);

😏