kkfileview(8)

本文介绍了Jackson库的三个核心模块,强调了在实际开发中常用的数据绑定功能,并提供了对象转换为Json的示例代码。同时,展示了如何处理日期格式,以及如何创建和操作Json节点。文章还通过一个具体的例子说明了如何从旧版Jackson迁移到新版,并给出了一个完整的Java对象序列化示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

com.fasterxml.jackson使用

Jackson主要包含了3个模块:

  • jackson-core
  • jackson-annotations
  • jackson-databind
    其中,jackson-annotations依赖于jackson-core,jackson-databind又依赖于jackson-annotations。

Jackson有三种方式处理Json:

  1. 使用底层的基于Stream的方式对Json的每一个小的组成部分进行控制
  2. 使用Tree Model,通过JsonNode处理单个Json节点
  3. 使用databind模块,直接对Java对象进行序列化和反序列化

通常来说,我们在日常开发中使用的是第3种方式,有时为了简便也会使用第2种方式,比如你要从一个很大的Json对象中只读取那么一两个字段的时候,采用databind方式显得有些重,JsonNode反而更简单。

    Maven包依赖:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.3.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.2</version>
    </dependency>


    对象或对象集合转Json时日期格式处理

    public static String Array2Json(Object array) throws RuntimeException {
        String result = "";
        ObjectMapper mapper = new ObjectMapper();
        try {
            mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
            result = mapper.writeValueAsString(array);
        } catch (Exception e) {
            log.error("JacksonUtil Exception>>>>>>>:{}", e.toString());
            throw new RuntimeException(e);
        }
        return result;
    }

    Jackson对象节点创建及使用

    public static String wrapSuccessString(String status, String jsonSource) {
        String result = null;
        ObjectMapper mapper = new ObjectMapper();
        try {
            ObjectNode node = mapper.createObjectNode();
            node.put("status", status);
            node.put("value", mapper.readTree(jsonSource));
     
            result = mapper.writeValueAsString(node);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return result;
    }

Jackson应该是目前最好的json解析工具了,之前一直用的是org.codehaus.jackson包中的工具,使用的

包是jackson-all-1.9.11.jar。

最近发现Jackson升级到2.2.3了,出于好奇,准备下载来测试一下,于是在官网下了一个jackson-core-2.2.3

的jar包,发现使用的包名都变成了com.fasterxml.jackson,而且没有找到ObjectMapper对象,以为是整个

设计全变了,看了一下jackson-core的文档,发现有个com.fasterxml.jackson.core.JsonFactory对象,

于是用其来构造com.fasterxml.jackson.core.JsonGenerator,调用writeObject(pojo)方法时

报pojo不是ObjectCodec对象的错误……

最后经过一番检查才发现是包没有导全的原因,Jackson2.2.3是有jackson-core-2.2.3、jackson-annotations-2.2.3、

jackson-databind-2.2.3三个包的,新的ObjectMapper对象在jackson-databind-2.2.3包中,具体使用实例如下。

        =====文件名:JacksonCoreTest.java=====import com.fasterxml.jackson.databind.ObjectMapper;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;/** * * @author yetao */public class JacksonCoreTest {    public static void main(String[] args) throws IOException{        ArrayList<String> lists = new ArrayList();        lists.add("testlist01");        lists.add("testlist02");        HashMap<String,String> maps = new HashMap();        maps.put("mapkey01","mapvalue01");        maps.put("mapkey02","mapvalue02");        User user1 = new User();        user1.setListinfo(lists);        user1.setMapinfo(maps);        user1.setNumber(100);        user1.setUid(10);        user1.setUname("yetao");        user1.setUpwd("666");        ObjectMapper mapper = new ObjectMapper();        // 仅输出一行json字符串        mapper.writeValue(System.out, user1);        // 将字符串美化成多行        System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user1));    }}

        =====文件名:User.java=====import java.util.ArrayList;import java.util.HashMap;public class User {    private int uid;    private String uname;    private String upwd;    private double number;    private ArrayList<String> listinfo;    private HashMap<String,String> mapinfo;    @Override    public String toString(){        StringBuilder sb = new StringBuilder();        sb.append("uid:").append(uid).append("\n");        sb.append("uname:").append(uname).append("\n");        sb.append("upwd:").append(upwd).append("\n");        sb.append("number:").append(number).append("\n");        sb.append("listinfo:").append("[");        for(String info:listinfo){            sb.append(info).append(";");        }        sb.append("]\n");        sb.append("mapinfo:").append("[");        for(String key:mapinfo.keySet()){            sb.append(key).append(":").append(mapinfo.get(key)).append(";");        }        sb.append("]\n");        return sb.toString();    }    public double getNumber() {        return number;    }    public void setNumber(double number) {        this.number = number;    }    public int getUid() {        return uid;    }    public void setUid(int uid) {        this.uid = uid;    }    public String getUname() {        return uname;    }    public void setUname(String uname) {        this.uname = uname;    }    public String getUpwd() {        return upwd;    }    public void setUpwd(String upwd) {        this.upwd = upwd;    }    /**     * @return the listinfo     */    public ArrayList<String> getListinfo() {        return listinfo;    }    /**     * @param listinfo the listinfo to set     */    public void setListinfo(ArrayList<String> listinfo) {        this.listinfo = listinfo;    }    /**     * @return the mapinfo     */    public HashMap<String,String> getMapinfo() {        return mapinfo;    }    /**     * @param mapinfo the mapinfo to set     */    public void setMapinfo(HashMap<String,String> mapinfo) {        this.mapinfo = mapinfo;    }}

美化成多行后的输出如下:

{  "uid" : 10,  "uname" : "yetao",  "upwd" : "666",  "number" : 100.0,  "listinfo" : [ "testlist01", "testlist02" ],  "mapinfo" : {    "mapkey02" : "mapvalue02",    "mapkey01" : "mapvalue01"  }}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧日的群星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值