使用Jackson进行json与java对象的转换

我的小号

3个依赖库:

lib/jackson-annotations-2.9.8.jar

lib/jackson-core-2.9.8.jar

lib/jackson-databind-2.9.8.jar


Jackson似乎不能直接使用一个静态方法来转换,需要创建一个mapper对象,并且要指定模板类。

比如,json:


{"id":1,"age":29,"name":"jien217","mapperList":[{"1":"aaa"},{"2":"bbb"},{"3":"ccc"},{"4":"ddd"},{"5":"eee"}]}

格式化一下:


{

"id":1,

"age":29,

"name":"jien217",

"mapperList":[

{"1":"aaa"},

{"2":"bbb"},

{"3":"ccc"},

{"4":"ddd"},

{"5":"eee"}

]

}


模型类:


public class User {

private int id;

private int age;

private String name;

private List<Map<Integer, String>> mapperList;

//已省略 getter、setter

}

开始转换:

首先需要一个 mapper对象:


ObjectMapper mapper = new ObjectMapper();

将Javabean转为json字符串:


System.out.println(mapper.writeValueAsString(userBean));

将Javabean转为json字符串并保存为文件:


mapper.writeValue(new File("config.json"), userBean);



将json字符串转换为Javabean:


User lan = mapper.readValue(jsonText, User.class);


直接将json文件读取json并转为Javabean


User user = mapper.readValue(new File("config.json"), User.class);



Jackson功能上肯定是足够强大的,就是在某些转换的时候有点麻烦。比如要将一个json进行格式化,需要先把json解析为java对象,再使用一下方法进行格式化,有点脱裤子放屁的感觉:


mapper.writerWithDefaultPrettyPrinter().writeValueAsString(userBean)

不过直接将json转换为java对象确实是厉害。



附:自定义的格式化json字符串方法:



/**

* 自定义 json 字符串的格式化方法

*/

public static String formatJsonText(String strJson) {

// 计数tab的个数

int tabNum = 0;

StringBuffer jsonFormat = new StringBuffer();

int length = strJson.length();


for (int i = 0; i < length; i++) {

char c = strJson.charAt(i);

if (c == '{') {

tabNum++;

jsonFormat.append(c);

if (tabNum == 1) {

jsonFormat.append("\n");

jsonFormat.append(getPadding(tabNum));

} else {

}

} else if (c == '}') {

tabNum--;

Character n = null;

if (i < length - 1)

n = strJson.charAt(i + 1);

if (tabNum == 0) {

jsonFormat.append("\n");

jsonFormat.append(getPadding(tabNum));

} else if (n != null && n == ']') {

jsonFormat.append(c);

continue;

}

jsonFormat.append(c);

} else if (c == ',') {

jsonFormat.append(c).append("\n");

jsonFormat.append(getPadding(tabNum));

} else if (c == '[') {

tabNum++;

jsonFormat.append(c).append("\n").append(getPadding(tabNum));

} else if (c == ']') {

tabNum--;

char p = strJson.charAt(i - 1);

if (p == '}') {

jsonFormat.append("\n").append(getPadding(tabNum)).append(c);

} else {

jsonFormat.append(getPadding(tabNum)).append("\n").append(c);

}

} else {

jsonFormat.append(c);

}

}

return jsonFormat.toString();

}


private static String getPadding(int tabNum) {

StringBuilder s = new StringBuilder();

for (int i = 0; i < tabNum; i++) {

s.append(" ");

}

return s.toString();

}

为什么需要自定义呢?因为即便经过jackson的格式化,效果还是这样:


{

"id" : 1,

"age" : 29,

"name" : "jien217",

"mapperList" : [ {

"1" : "aaa"

}, {

"2" : "bbb"

}, {

"3" : "ccc"

}, {

"4" : "ddd"

}, {

"5" : "eee"

} ]

}

该自定义的方法的效果是这样:


{

"id":1,

"age":29,

"name":"jien217",

"mapperList":[

{"1":"aaa"},

{"2":"bbb"},

{"3":"ccc"},

{"4":"ddd"},

{"5":"eee"}

]

}

我需要把它用在一个项目的配置文件中,希望文件方便程序编辑,又比较直观易懂。配置文件的格式就是上面那样,所以上面的格式化效果应该是最优的了。

主 楼 发布于:2019-03-20 17:26:51 编辑于:2019-03-20 18:36:18回复
我的小号

由于前端接收到的服务器数据都是字符串,因而对象与字符串的转换成了前端的刚需。json在这种情况下,便成了字符串与对象之间的转换的事实标准。而java自身显然没有对这种情况作充足的处理,比如map:


Map<String, String> map = new HashMap<>();

map.put("name", "jien");

map.put("age", "25");

map.put("id", "2");

map.put("desc", "null, name=jien, id=2, age=25");

System.out.println(map.toString());

输出:


{name=jien, id=2, age=25, desc=null, name=jien, id=2, age=25}

这时就转不回来了。因此,json是更好的选择。

在软件的配置文件方面,json由于方便转换,今后使用json应该是趋势。

2 楼 发布于:2019-03-20 18:03:19
回复
我的小号

上面json字符串使用idea进行格式化:


{

"id": 1,

"age": 29,

"name": "jien217",

"mapperList": [

{

"1": "aaa"

},

{

"2": "bbb"

},

{

"3": "ccc"

},

{

"4": "ddd"

},

{

"5": "eee"

}

]

}

效果不好,使用几个在线的格式化工具也是一样。看来特定的场景还是得定制才行。

3 楼 发布于:2019-03-20 18:24:51
回复
旅行者

fastjson也可以:


ConfigModel config = JSON.parseObject(builder.toString(), new TypeReference<ConfigModel>() {

});

4 楼 发布于:2019-03-21 12:36:24
回复
絮飘池舞

生下来的人没有怕死的,怕死的都TM没生下来,所以谁都别TM的装横!

5 楼 发布于:2019-05-04 00:48:20
回复
心灵守候者

万恶意淫为首,百善回帖为先

6 楼 发布于:2019-07-17 12:42:04
回复
飞扬_

出来混老婆总是要换的

7 楼 发布于:2020-03-25 06:53:28
回复

发表回复: