在项目的需求过程中,涉及到了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"); //将值一一的取出来
自己想要什么结果都可以取出来,然后再进行自己的操作或者判断即可。