你是否也在为每次查询json格式转换而烦恼?

2022-07-28,,,

日常开发过程中,我们常常要用到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

《你是否也在为每次查询json格式转换而烦恼?.doc》

下载本文的Word格式文档,以方便收藏与打印。