你是否也在为每次查询json格式转换而烦恼?
程序员文章站
2022-11-15 15:46:59
日常开发过程中,我们常常要用到json形式的数据,也常常会需要json与其他格式之间进行转化。但是这个东西往往很多人没有记住,所以每次都需要面向博客编程,所以在此整理一下,以便更好的查询~~~首先是针对银行来讲,比较安全的jackson:public static void main(String[] args) {Aliyun aliyun = new Aliyun();aliyun.setAppKey("aaaaaaa");aliyun.setAppSecret("hahaha"...
日常开发过程中,我们常常要用到json形式的数据,也常常会需要json与其他格式之间进行转化。
但是这个东西往往很多人没有记住,所以每次都需要面向博客编程,所以在此整理一下,以便更好的查询~~~
一、首先是针对银行来讲,比较安全的jackson:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
public class Aliyun {
private String AppKey;
private String appSecret;
private String bucket;
private String endPoint;
public String getAppKey() {
return AppKey;
}
public void setAppKey(String AppKey) {
this.AppKey = AppKey;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public String getEndPoint() {
return endPoint;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
}
1.对象和json之间的转换:
public static void main(String[] args) {
Aliyun aliyun = new Aliyun();
aliyun.setAppKey("aaaaaaa");
aliyun.setAppSecret("hahaha");
ObjectMapper objectMapper = new ObjectMapper();
try {
//将对象转换成json字符串
String s = objectMapper.writeValueAsString(aliyun);
System.out.println(s);
//将json字符串转换成对象
Aliyun aliyun2 = (Aliyun)objectMapper.readValue(s, Aliyun.class);
System.out.println(aliyun2.getAppKey());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
输出的结果如下:
注:appKey变成了小写首字母a
{"appKey":"aaaaaaa","appSecret":"hahaha","bucket":null,"endPoint":null}
aaaaaaa
2.list集合和json之间的转换
public static void main(String[] args) {
Aliyun aliyun = new Aliyun();
aliyun.setAppKey("aaaaaaa");
aliyun.setAppSecret("hahaha");
List<Aliyun> list = new ArrayList<>();
list.add(aliyun);
ObjectMapper objectMapper = new ObjectMapper();
try {
//将集合转换成json字符串
String s = objectMapper.writeValueAsString(list);
System.out.println(s);
//将json字符串转换成集合
List aliyun2 = objectMapper.readValue(s, List.class);
System.out.println(aliyun2.get(0));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
输出的结果如下:
[{"appSecret":"hahaha","bucket":null,"endPoint":null,"appKey":"aaaaaaa"}]
{appSecret=hahaha, bucket=null, endPoint=null, appKey=aaaaaaa}
3.map集合与josn之间的转换:
public static void main(String[] args) {
Aliyun aliyun = new Aliyun();
aliyun.setAppKey("aaaaaaa");
aliyun.setAppSecret("hahaha");
Map<String,Aliyun> map = new HashMap<String, Aliyun>();
map.put("test", aliyun);
ObjectMapper objectMapper = new ObjectMapper();
try {
//将集合转换成json字符串
String s = objectMapper.writeValueAsString(map);
System.out.println(s);
//将json字符串转换成集合
Map aliyun2 = objectMapper.readValue(s, Map.class);
System.out.println(aliyun2.get("test"));
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
结果如下:
{"test":{"appSecret":"hahaha","bucket":null,"endPoint":null,"appKey":"aaaaaaa"}}
{appSecret=hahaha, bucket=null, endPoint=null, appKey=aaaaaaa}
二、其次是用的比较多的fastjson:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.57</version>
</dependency>
这里就不一一展示了:
public static void main(String[] args) {
Aliyun aliyun = new Aliyun();
aliyun.setAppKey("aaaaaaa");
aliyun.setAppSecret("hahaha");
Map<String,Aliyun> map = new HashMap<String, Aliyun>();
map.put("test", aliyun);
try {
//将集合转换成json字符串
String s = JSON.toJSONString(map);
System.out.println(s);
//将json字符串转换成集合
Map aliyun2 = (Map)JSON.parse(s);
System.out.println(aliyun2.get("test"));
//将对象转换为json
String s1 = JSON.toJSONString(aliyun);
System.out.println(s1);
//将json转换为对象
Aliyun aliyun3 = JSON.parseObject(s1,Aliyun.class);
System.out.println(aliyun3.getAppKey());
Aliyun aliyun4 = JSON.toJavaObject(JSON.parseObject(s1),Aliyun.class);
System.out.println(aliyun4.getAppKey());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
三、至于fastjson不安全的原因,本人多少看过一些,网上也不乏这方面的资料。大致的意思是围绕autotype展开的,简单说一点:当一个类中包含了一个接口(或抽象类)的时候,在使用fastjson进行序列化的时候,会将子类型抹去,只保留接口(抽象类)的类型,使得反序列化时无法拿到原始类型。
后续阿里巴巴提出使用
SerializerFeature.WriteClassName
标记子类型,这样反序列化的时候就可以拿到子类型,但是又被黑客指定一个自己想要使用的攻击类库(具体的就不太清楚了~~),随后阿里想要默认关闭autotype,并且通过checkAutotype,加入了黑名单+白名单来防御autotype开启的情况,而黑客的攻击方向又变成了如何绕过checkAutotype;目前阿里较新的版本中设置里safeMode(安全模式),使用者可以升级到新的版本来规避不必要的问题,但是像银行等机构为了安全好多已经内部邮件更换成jackson了,这是后话了~
本文地址:https://blog.csdn.net/yeshenyuexieriji/article/details/109571896