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 判断,将值塞到一个对象里去,一百多行了,看起来真的难受,想请教下有没有没有比较好的优化方案

3480 次点击
所在节点    程序员
26 条回复
IvanLi127
2023-01-06 00:47:17 +08:00
你啥语言,我用 js 写的话没几行。。就直接写,你不会是 java 吧
autoxbc
2023-01-06 01:15:27 +08:00
Java 开发者:虽然不知道为什么,我先在这里放上一个 class ;
JS 开发者:虽然忘了怎么写的,不过已经写完了,反正没报错;
hhjswf
2023-01-06 02:03:27 +08:00
既然前端那么好处理,那就交给前端做。。。
TWorldIsNButThis
2023-01-06 02:17:56 +08:00
如果字段是固定的 java 的话就建两个 class 呗
ddvswgg
2023-01-06 04:57:52 +08:00
def conversion(input_data):
dict_grades = {
"isAbsent":None,
"grades":{}
}

# attendance
if input_data['examinationStatus']['absent']:
dict_grades['isAbsent'] = True
else:
dict_grades['isAbsent'] = False

# grades
for subject, score in input_data['grades'].items():
if score >= 90:
dict_grades['grades'][subject] = '优秀'
else:
dict_grades['grades'][subject] = '垃圾'

return dict_grades


-------------------------
input_data = {
"examinationStatus":{
"absent":False,
"noAbsent":True
},
"grades":{
"math":90,
'english':50
}
}


output_data = {'isAbsent': False, 'grades': {'math': '优秀', 'english': '垃圾'}}



这是你想要的么?
Edward4074
2023-01-06 05:09:29 +08:00
JsonPath ?
zxCoder
2023-01-06 09:15:34 +08:00
看这描述好像是 Java 。。。
ljsh093
2023-01-06 09:21:07 +08:00
jsonpath 判断值,class 类转换,map 火葬场
oneisall8955
2023-01-06 10:00:06 +08:00
写一个工具,也不用多少时间吧,有时间写个 Demo 。先说个思路,有个抽象的规则处理类,存取目标 jsonpath 和要删除 jsonpath ,还有替换成的 jsonpath 和对应的 value 等等。然后写各个实现,用个 list 存取各个规则实现的实例,遍历处理
bk201
2023-01-06 10:16:03 +08:00
map 做值映射,然后遍历替换?
zhy0216
2023-01-06 11:46:28 +08:00
xiangyuecn
2023-01-06 12:01:26 +08:00
写两个函数的事,get 、set

什么 class 不 class 的,map 一把梭,两行代码搞定
ragnaroks
2023-01-06 12:44:03 +08:00
如果 "90" => "优秀" 是固定的,那么直接做字符串替换就行了?
dreampuf
2023-01-06 14:12:37 +08:00
jq?
```
def grade(score): if score >= 90 then "优秀" else "不合格" end; {isAbsent: .examinationStatus.absent, grades: { math: grade(.grades.math) }}
```
chenjiangui998
2023-01-06 14:28:29 +08:00
for (let i=80;i<=100;i++) {
let reg = `${i}`
json = json.replaceAll(reg, '优秀')
}
直接正则替换? 伪代码
issakchill
2023-01-06 17:43:55 +08:00
JsonPath
NGXDLK
2023-01-06 17:52:51 +08:00
这完全是两种不同的结构,加两个类吧
zhazi
2023-01-06 18:32:16 +08:00
如果你要动态转换可以参考这个方案: https://docs.oracle.com/cd/E29542_01/doc.1111/e26693/dc_intro.htm#WCCAA2894
如果你想的是静态转换直接使用 MapStruct
@Mapping(source="source.examinationStatus.absent",target="isAbsent")
Target convert(Source souce)
Ranni
2023-01-06 23:41:13 +08:00
不好意思,忘记说了是 Java
Ranni
2023-01-06 23:41:34 +08:00
@zhazi 谢谢,我看看这两方案

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

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

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

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

© 2021 V2EX