Java--json序列化与反序列化

     在项目的需求过程中,涉及到了Json字符串的序列化与反序列化的问题,请求报文,响应报文都需要将其转化为相对应的样式。

需要的报文格式:


     在传值的过程中,我们需要一个一个字段的方式赋值,转换可以采纳两种方式

方式一:直接使用Map赋值的方式

直接定义三个map集合,赋值使用,然后通过jsonObject序列化转化,主要代码如下:

	Map<String, Map<String, String>> credit = new HashMap<String, Map<String, String>>();
	Map<String, String> body = new HashMap<String, String>();
	Map<String, String> header = new HashMap<String, String>();
	// 给header赋值
	header.put("date", DateUtils.getNowDateStr());
	header.put("name", name);
	// 给body赋值
	body.put("id", id);
	body.put("phone", phone);
	// 将header和body赋值给credit
	credit.put("header", header);
	credit.put("body", body);
	// jsonObject序列化转换
	String creditString = JSONObject.toJSONString(credit);

方式二:采用内部类的方式,赋值

什么叫内部类呢?一个类的定义放在另一个类的内部,内部类的定义:

简单的构造成json字符串是不符合要求的,那么该如何生成他想要的形式的,看格式可以发现他们是层层包含的关系,我们可以定义三个类去实现,但是为了避免空间,所以采用的内部类的方法。

我们把三个子类都放在一个类中,然后通过实体定义的方式添加关系,具体代码如下:

public class Telecom {
	public class Credit implements Serializable{
		private Body body;   //定义body
		private Header header;  //定义header
		public Body getBody() {
			return body;
		}
		public void setBody(Body body) {
			this.body = body;
		}
		public Header getHeader() {
			return header;
		}
		public void setHeader(Header header) {
			this.header = header;
		}
	}
	public class Body implements Serializable {
		/**
		 * 被查询人姓名
		 */
		private String personName;
		***实体部分省略***
		public String getPersonName() {
			return personName;
		}
		public void setPersonName(String personName) {
			this.personName = personName;
		}
	}
	public class Header implements Serializable {
		private String version = "0100";  //版本
		private String date;   //日期
		***部分实体以及get,set方法省略***

然后在实现中,我们则可以直接调用赋值使用:

                //定义变量telecom
		Telecom telecom = new Telecom();
		Telecom.Credit credit = telecom.new Credit();   //定义credit变量
		Telecom.Body body = telecom.new Body();    //定义body变量

		body.setIdNumber(id);   //body赋值
                
		Telecom.Header header = telecom.new Header();    //定义header变量
		header.setActionCode("0");    //header赋值
                
		credit.setBody(body);  //credit赋值header和body
		credit.setHeader(header);
		// 转成字符串格式
		String creditstring = JSONObject.toJSONString(credit);
		// 拼接报文格式
		String getRequestTokenMap = "{" + '"' + "credit" + '"' + ":"
				+ creditstring;
		System.out.println(getRequestTokenMap);    //最后输出结果

     当信息验证之后传回来的时候,传给我们的依旧是Json样式,这时我们又需要反序列化将json中字符串的值一一的获取出来,这次我采用的是最简单的“拆分法”的方式。

               // 将结果转换成jsonarray对象
		JSONArray jsonArray = JSONObject.parseArray(sBufferToken);
		JSONObject jsonone = jsonArray.getJSONObject(0);
		System.out.println(jsonone);
		JSONObject credit = jsonone.getJSONObject("credit");
		JSONObject header = credit.getJSONObject("header");
		JSONObject body = credit.getJSONObject("body");
		// 将body中的某个值取出来
		System.out.println(header);
		System.out.println(body);
		String rspCode = header.getString("rspCode");    //将值一一的取出来

自己想要什么结果都可以取出来,然后再进行自己的操作或者判断即可。

Java 中的 JSON 序列化反序列化可以使用许多第三方库来实现,比如 Jackson、Gson、FastJson 等。这里以 Jackson 库为例,介绍如何进行 JSON 序列化反序列化。 ### Jackson 序列化 Jackson 序列化可以将 Java 对象转换为 JSON 字符串。示例代码如下: ```java ObjectMapper objectMapper = new ObjectMapper(); MyObject myObject = new MyObject(); // 要序列化Java 对象 String json = objectMapper.writeValueAsString(myObject); // 序列化JSON 字符串 ``` 在上面的代码中,ObjectMapper 是 Jackson 序列化反序列化的核心类。writeValueAsString() 方法将 Java 对象序列化JSON 字符串。 如果要对序列化后的 JSON 字符串进行格式化,可以使用 ObjectMapper 的 writerWithDefaultPrettyPrinter() 方法: ```java ObjectMapper objectMapper = new ObjectMapper(); MyObject myObject = new MyObject(); // 要序列化Java 对象 String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(myObject); // 序列化成格式化后的 JSON 字符串 ``` ### Jackson 反序列化 Jackson 反序列化可以将 JSON 字符串转换为 Java 对象。示例代码如下: ```java ObjectMapper objectMapper = new ObjectMapper(); String json = "{\"name\":\"Tom\", \"age\":20}"; // 要反序列化JSON 字符串 MyObject myObject = objectMapper.readValue(json, MyObject.class); // 反序列化Java 对象 ``` 在上面的代码中,readValue() 方法将 JSON 字符串反序列化Java 对象。第一个参数是要反序列化JSON 字符串,第二个参数是目标 Java 类型。 ### Jackson 注解 Jackson 序列化反序列化还支持一些注解,用于控制序列化反序列化的行为。比如,可以使用 @JsonProperty 注解指定 JSON 字段名: ```java public class MyObject { @JsonProperty("user_name") private String name; private int age; // ... } ``` 在上面的代码中,@JsonProperty("user_name") 注解指定了 JSON 字段名为 "user_name",而不是默认的 "name"。这样,在序列化反序列化时,Jackson 就会使用指定的字段名。 除了 @JsonProperty 注解,Jackson 还支持许多其他注解,比如 @JsonIgnore、@JsonFormat、@JsonInclude 等。这些注解可以用于控制序列化反序列化的行为,更多的注解用法可以参考 Jackson 的官方文档。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值