赞
踩
有时候,我们需要从写好的 Java 类得到 JSON字符串(Java类一般指 DTO/XxxRequest,即 controller 接口用来接收参数的 POJO),用于postman调用接口的时候的入参。
比如,DemoDTO是controller接口的入参,我现在要用postman简单测一下,我怎么样快速得到 json 字符串呢?
@Data public class DemoDTO { private String str1; private Integer integer1; private Long long1; private Boolean bool; private Double double1; private BigDecimal bigDecimal1; private Date javaUtilDate; private Timestamp javaSqlTimestamp; private List<String> strList; private Map<String, String> additionalMap; private Sub sub; private List<Sub> subList; private OuterSub outerSub; private List<OuterSub> outerSubs; @Data public static class Sub { private String str1; private List<String> strList; } } @Data public class OuterSub { private String str1; private Integer integer1; }
通过 IDEA 的一些插件,可以实现。一般是装了这些插件后,在类上右键选择 convert to JSON 之类的菜单, JSON 字符串便自动保存到剪切板。
如下是一些常见的POJO转JSON字串的插件,以及我试验的插件版本(IDEA是2020.1.3 ultimate)
1)RestfulToolKit-fix(2.0.7,Convert to JSON
等菜单)
https://plugins.jetbrains.com/plugin/16788-restfultoolkit-fix
一些嵌套结构无法体现,完全不能用,绝对是要弃用的
2)Java Bean to Json(1.0.7,菜单Convert to JSON
)
https://plugins.jetbrains.com/plugin/10336-java-bean-to-json
建议别用,这款在某些情况下得到的JSON字串也是会有缺少结构
3)POJO to JSON(1.0,作者李大麦,菜单MakeJson
)
https://plugins.jetbrains.com/plugin/9686-pojo-to-json
实测无论任何的嵌套结构都能得到正确的JSON字串(推荐,但遇到循环引用会导致IDEA无响应,且不支持枚举)
4)POJO to JSON(1.0.8,作者organics2016,菜单)
https://plugins.jetbrains.com/plugin/12066-pojo-to-json
极力推荐,没有硬伤,循环引用会提示错误比较友好,支持枚举
因为我的idea是2020.1.3,能安装的版本是1.0.8,安装不了更新的插件
如图,箭头从上到下分别是 RestfulToolKit-fix、POJO to JSON(4)Java Bean to Json、POJO to JSON(3)插件的菜单
测试IDEA版本:Mac版,2020.1.3 Ultimate
插件地址:https://plugins.jetbrains.com/plugin/16788-restfultoolkit-fix
前者是后者的修复版,后者是原作者的版本很久都没更新,有些bug如不能兼容高版本的 IDEA 等。
这个插件本来是用来搜索endpoint的,但是也附带有转 JSON字符串的功能。
转换的效果:非常不理想,绝对是要弃用的,许多字段在转换过程中丢失了!!!
// javaSqlTimestamp 不见了!!additionalMap不见了!!sub不见了!!outerSub不见了!!丢失了这么多字段!!! // subList首先解析错误,不是对象,应该是数组,而且subList里的对象丢失了一些字段如strList { "str1": "demoData", "integer1": 1, "long1": 1, "bool": true, "double1": 1.0, "bigDecimal1": 1, "javaUtilDate": "2022-10-27 21:15:00", "strList": [ "demoData" ], "subList": { "str1": "demoData" }, "outerSubs": { "str1": "demoData", "integer1": 1 } }
插件地址:https://plugins.jetbrains.com/plugin/10336-java-bean-to-json/versions
转换的结果:
// 可以看到对子类还是还原得不错,无论是内部类Sub还是外部类OuterSub都能还原, // 就是对于 private List<Sub> subList; private List<OuterSub> outerSubs; 这类的结构还原得不好,直接结构丢失了 { "str1": "", "integer1": 0, "long1": 0, "bool": false, "double1": 0.0, "bigDecimal1": 0.0, "javaUtilDate": "2022-10-27 20:48:38", "javaSqlTimestamp": 1666874918458, "strList": [ "" ], "additionalMap": {}, "sub": { "str1": "", "strList": [ "" ] }, "subList": [], "outerSub": { "str1": "", "integer1": 0 }, "outerSubs": [] }
补充1:对枚举也能很好识别,得到的样式是将所有的枚举列举出来
{
"typeEnum1": [
"TYPE1",
"TYPE2"
]
}
补充2:对于循环引用,不会报错,循环引用的字段被忽略掉,也不会导致IDEA无响应
@Data
public class Stu {
private String name;
private Integer age;
private Stu stu;
}
得到
{
"name": "",
"age": 0
}
插件地址:https://plugins.jetbrains.com/plugin/9686-pojo-to-json
转换的结果:
// 可以看到这个插件非常完美地获得了json格式(获取的时候不是 pretty format的,上述是后期用用别的工具格式化的,有点遗憾) // 难能可贵的是,类型有比较好的提示,如`Map<String, String>`,字符串也用了比较明显的 `"str"`。 { "str1": "str", "integer1": 0, "long1": 0, "bool": true, "double1": 0, "bigDecimal1": "BigDecimal", "javaUtilDate": 1666877320450, "javaSqlTimestamp": "Timestamp", "strList": [ "str" ], "additionalMap": "Map<String, String>", "sub": { "str1": "str", "strList": [ "str" ] }, "subList": [ { "str1": "str", "strList": [ "str" ] } ], "outerSub": { "str1": "str", "integer1": 0 }, "outerSubs": [ { "str1": "str", "integer1": 0 } ] }
测试它不支持两样东西:
枚举
遇到枚举类的时候实际会报错,但是表面上没有任何提示(之前转换成功后在IDEA右下角有消息通知),剪切板内容不会更新(还是保留上次的剪切板里的内容。你要注意把上次的剪切板内容稍微改下内容,不然你 “不加枚举字段MakeJson一次,加上枚举再MakeJson一次” 这种场景可能会让你以为只是忽略了枚举字段,即前面那次无枚举正常转换后面那次不正常转换但是保留了上次的剪切板让你以为 “增加枚举字段只是被忽略了”)
// 不支持枚举
@Data
public class Stu {
private String name;
private Integer age;
private TypeEnum typeEnum;
}
public enum TypeEnum {
TYPE1, TYPE2
}
不支持嵌套:我估计实际是报错的,但是没有任何错误提示。最后会导致idea无响应!!!
@Data
public class Stu {
private String name;
private Integer age;
private Stu stu;
}
插件地址:https://plugins.jetbrains.com/plugin/12066-pojo-to-json
转换结果:非常完美!枚举也是支持的,而且循环引用的也会报错提示
{ "str1": "", "integer1": 0, "long1": 0, "bool": false, "double1": 0.00, "bigDecimal1": 0.00, "javaUtilDate": "2022-10-27 20:48:37", "javaSqlTimestamp": "2022-10-27 20:48:37", "typeEnum1": "TYPE1", "strList": [ "" ], "additionalMap": {}, "sub": { "str1": "", "strList": [ "" ] }, "subList": [ { "str1": "", "strList": [ "" ] } ], "outerSub": { "str1": "", "integer1": 0 }, "outerSubs": [ { "str1": "", "integer1": 0 } ] }
补充1:循环引用
@Data
public class Stu {
private String name;
private Integer age;
private Stu stu;
}
报错并且不会将内容拷贝进剪切板(还是上一次的剪切板内容)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。