欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-03 23:42:09
日常开发过程中,我们常常要用到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

相关标签: json java