一般转换为json格式后key都是小写的,但是有时候json格式解析时不同的方式可能对大写小敏感,导致解析失败,这里记录一下怎么在转json格式时key为大写
注:主要运用到的一个json工具包是net.sf.json,主要包是net.sf.json.JsonConfig,没有的可以先引入依赖
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.3</version>
<classifier>jdk15</classifier>
<!-- jdk版本,必须写jdk15 -->
</dependency>
附
这里必须要加一个jdk版本,但是我写jdk8的时候是没有引入成功,也没有net.sf.json.JsonConfig的包的,填写jdk15就可以了,不知道是不是这个方法是在后面的版本才有的,这里没有去研究了,有知道的大佬可以评论告知我一下。
1、准备工作做好后,我们开始编写一个测试用的实体类
package com.test.entity;
import com.annotation.Explain;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
public class TestBean {
private int id;
//菜单名称
private String name_ss;
//菜单url
private String url;
//顺序
private int sort;
private Date endDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName_ss() {
return name_ss;
}
public void setName_ss(String name_ss) {
this.name_ss = name_ss;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
2、主体方法(代码里面都有注释,这里不做讲解了)
/***
* list转json格式,实现json格式的key大写
* @param eList list对象
* @param target list泛型属性.class
* @param aClass Class<list泛型属性>
* @return
*/
public static String setJsonKeyUP(List<?> eList,Class target,Class<?> aClass){
//返回json格式key转大写
JsonConfig jsonConfig=new JsonConfig();
//属性过滤
jsonConfig.registerPropertyExclusions(target, new String[]{"id"});
PropertyNameProcessor propertyNameProcessor=new PropertyNameProcessor() {
@Override
public String processPropertyName(Class aClass, String s) {
//System.out.println("aClass = [" + aClass + "], s = [" + s + "]");
return s.toUpperCase();
}
};
jsonConfig.registerJsonPropertyNameProcessor(target,propertyNameProcessor);
jsonConfig.registerJsonPropertyNameProcessor(aClass,propertyNameProcessor);
JSONArray jsonArray=JSONArray.fromObject(eList,jsonConfig);
String result = jsonArray.toString();
return result;
}
//list转json
public static String setJsonStr(List<?> list){
JSONArray jsonArray=JSONArray.fromObject(list);
String result = jsonArray.toString();
return result;
}
3、main方法测试
public static void main(String[] args) {
List<TestBean> beanList = new ArrayList<TestBean>();
for (int i = 0; i <3 ; i++) {
TestBean bean = new TestBean();
bean.setName_ss("张三"+i);
bean.setSort(i);
beanList.add(bean);
}
Class<TestBean> aClass=null;
//list转json格式,实现json格式的key大写
String str = setJsonKeyUP(beanList, TestBean.class,aClass);
System.out.println("json格式的key大写:"+str);
List<TestBean> tsetList = new ArrayList<>();
TestBean bean = new TestBean();
bean.setName_ss(str);
tsetList.add(bean);
//list转json
String strJson =setJsonStr(tsetList);
System.out.println("带斜杠的json格式字符串:"+strJson);
//去除json带“\”的转义符
String tmp = StringEscapeUtils.unescapeJavaScript(strJson);
System.out.println("去掉斜杠后的json格式字符串:"+tmp);
}
这个第一个输出就是list转json格式后key大写的字符串
json格式的key大写:
[{"ENDDATE":null,"NAME_SS":"张三0","SORT":0,"URL":""},
{"ENDDATE":null,"NAME_SS":"张三1","SORT":1,"URL":""},
{"ENDDATE":null,"NAME_SS":"张三2","SORT":2,"URL":""}]
这里随带说一下另一个问题,就是在json字符串进行二次转json的时候回出现""转义符(实例为:第二个输出),有时候去解析的时候也会有问题,这时候我们要去掉斜杆转义符!
带斜杠的json格式字符串:[{"endDate":null,"id":0,"name_ss":"
[{\"ENDDATE\":null,\"NAME_SS\":\"张三0\",\"SORT\":0,\"URL\":\"\"},
{\"ENDDATE\":null,\"NAME_SS\":\"张三1\",\"SORT\":1,\"URL\":\"\"},
{\"ENDDATE\":null,\"NAME_SS\":\"张三
2\",\"SORT\":2,\"URL\":\"\"}]","sort":0,"url":""}]
去掉斜杆转义符就一行代码
String tmp = StringEscapeUtils.unescapeJavaScript(strJson);
去掉斜杠后的json格式字符串:[{"endDate":null,"id":0,"name_ss":"
[{"ENDDATE":null,"NAME_SS":"张三0","SORT":0,"URL":""},
{"ENDDATE":null,"NAME_SS":"张三1","SORT":1,"URL":""},
{"ENDDATE":null,"NAME_SS":"张三
2","SORT":2,"URL":""}]","sort":0,"url":""}]
你学费了吗?