欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jackson学习实例

程序员文章站 2022-07-12 23:21:10
...

一.Jackson使用Tree Model读取以及更新JSON

        使用ObjectMapper,可以以类似读取DOM的方式读取JSON,实例如下:

package com.bijian.study;

import java.util.Iterator;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ObjectNode;

public class JacksonDemo01 {

    public static void main(String[] args) {
        JacksonParseJSON();
        JacksonUpdateJSON();
    }
    
    private static void JacksonParseJSON() {
        
        System.out.println("JacksonParseJSON():");
        System.out.println("***************************************");
        String str = "{\"weatherinfo\":{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17 15:46:20\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}}";
        ObjectMapper m = new ObjectMapper();  
        try {
            JsonNode rootNode = m.readTree(str);
            
            JsonNode weaNode = rootNode.get("weatherinfo");  
            System.out.println(weaNode);  
            System.out.println(weaNode.get("city"));  
              
            // Use Iterator to traverse to tree  
            Iterator<String> keys = weaNode.getFieldNames();   
            while(keys.hasNext()){  
                String fieldName = keys.next();  
                System.out.println(fieldName + ": " + weaNode.get(fieldName).getTextValue());  
            }
            System.out.println("***************************************");
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    
    private static void JacksonUpdateJSON() {
        
        System.out.println("JacksonUpdateJSON():");
        System.out.println("***************************************");
        ObjectMapper mapper = new ObjectMapper();
        // will be of type ObjectNode  
        JsonNode rootNode = mapper.createObjectNode();
        ((ObjectNode) rootNode).put("name", "jingshou");  
        ((ObjectNode) rootNode).put("id", 523);  
        ((ObjectNode) rootNode).put("age", 30);   
        System.out.println(rootNode);  
        
        try {
            String json = mapper.writeValueAsString(rootNode);
            System.out.println(json);  
            ((ObjectNode) rootNode).remove("id");  
            System.out.println(rootNode);
            System.out.println("***************************************");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

JacksonParseJSON():
***************************************
{"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":"2016-03-17 15:46:20","week":"星期日","fchh":"11","cityid":"101210101"}
"杭州"
city: 杭州
city_en: hangzhou
date_y: 2014年1月12日
date: 2016-03-17 15:46:20
week: 星期日
fchh: 11
cityid: 101210101
***************************************
JacksonUpdateJSON():
***************************************
{"name":"jingshou","id":523,"age":30}
{"name":"jingshou","id":523,"age":30}
{"name":"jingshou","age":30}
***************************************

 

二.Jackson的对象与json之间的转换

package com.bijian.study;

import java.io.StringWriter;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.ObjectMapper;

import com.bijian.study.dto.User;
import com.bijian.study.dto.Weather;

public class JacksonDemo02 {
    
    public static void main(String[] args) {
        JacksonChangeJSON01();
        JacksonChangeJSON02();
    }
    
    /**
     * Jackson的对象与json之间的转换
     */
    private static void JacksonChangeJSON01() {
        
        StringBuilder sb = new StringBuilder();  
        sb.append("{");  
        sb.append("\"name\" : { \"first\" : \"Joe\", \"last\" : \"Sixpack\" },");  
        sb.append("\"gender\" : \"MALE\",");  
        sb.append("\"verified\" : false,");  
        sb.append("\"userImage\" : \"Rm9vYmFyIQ==\"");  
        sb.append("}");  
          
        ObjectMapper mapper = new ObjectMapper();
        try {
            User user = mapper.readValue(sb.toString(), User.class);
            ObjectMapper mapper2 = new ObjectMapper();    
            StringWriter sw = new StringWriter();    
            JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);    
            mapper2.writeValue(gen, user);    
            gen.close();    
            String json = sw.toString();  
            System.out.println(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * Jackson的对象与json之间的转换
     */
    private static void JacksonChangeJSON02() {
        
        String str = "{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}";
        ObjectMapper m = new ObjectMapper();
        try {
            Weather w = m.readValue(str, Weather.class);
            ObjectMapper mapper2 = new ObjectMapper();    
            StringWriter sw = new StringWriter();    
            JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);    
            mapper2.writeValue(gen, w);    
            gen.close();    
            String json = sw.toString();  
            System.out.println(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.bijian.study.dto;

public class User {  
    
    public enum Gender {  
        MALE, FEMALE  
    };  
  
    public static class Name {  
        private String _first, _last;  
  
        public String getFirst() {  
            return _first;  
        }  
  
        public String getLast() {  
            return _last;  
        }  
  
        public void setFirst(String s) {  
            _first = s;  
        }  
  
        public void setLast(String s) {  
            _last = s;  
        }  
    }  
  
    private Gender _gender;  
    private Name _name;  
    private boolean _isVerified;  
    private byte[] _userImage;  
  
    public Name getName() {  
        return _name;  
    }  
  
    public boolean isVerified() {  
        return _isVerified;  
    }  
  
    public Gender getGender() {  
        return _gender;  
    }  
  
    public byte[] getUserImage() {  
        return _userImage;  
    }  
  
    public void setName(Name n) {  
        _name = n;  
    }  
  
    public void setVerified(boolean b) {  
        _isVerified = b;  
    }  
  
    public void setGender(Gender g) {  
        _gender = g;  
    }  
  
    public void setUserImage(byte[] b) {  
        _userImage = b;  
    }  
}
package com.bijian.study.dto;

import java.util.Date;

public class Weather {

    private String city;
    private String city_en;
    private String date_y;
    private Date date;
    private String week;
    private int fchh;
    private String cityid;
    
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getCity_en() {
        return city_en;
    }
    public void setCity_en(String city_en) {
        this.city_en = city_en;
    }
    public String getDate_y() {
        return date_y;
    }
    public void setDate_y(String date_y) {
        this.date_y = date_y;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getWeek() {
        return week;
    }
    public void setWeek(String week) {
        this.week = week;
    }
    public int getFchh() {
        return fchh;
    }
    public void setFchh(int fchh) {
        this.fchh = fchh;
    }
    public String getCityid() {
        return cityid;
    }
    public void setCityid(String cityid) {
        this.cityid = cityid;
    }
}

运行结果:

{"verified":false,"gender":"MALE","userImage":"Rm9vYmFyIQ==","name":{"first":"Joe","last":"Sixpack"}}
{"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":1458172800000,"week":"星期日","fchh":11,"cityid":"101210101"}

 

三.设置时间格式

package com.bijian.study;

import java.io.StringWriter;
import java.text.SimpleDateFormat;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;

import com.bijian.study.dto.Weather;

public class JacksonDemo03 {

    /**
     * Json时间格式
     */
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    static ObjectMapper mapper = null;
    
    static{
            mapper = new ObjectMapper();
            SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT);  
            mapper.setDateFormat(fmt);
            mapper.enable(Feature.WRITE_NULL_MAP_VALUES);
            mapper.enable(Feature.WRITE_EMPTY_JSON_ARRAYS);
    }

    public static <T> T parse(JsonNode root, Class<T> rootType) {
        try {
            return mapper.readValue(root, rootType);
        } catch (Exception e) {
            throw new RuntimeException("JsonNode转换" + rootType.getName() + "异常", e);
        }
    }
    
    public static void main(String[] args) {
        jacksonChangeJson();
    }
    
    private static void jacksonChangeJson() {

        String str = "{\"weatherinfo\":{\"city\":\"杭州\",\"city_en\":\"hangzhou\",\"date_y\":\"2014年1月12日\",\"date\":\"2016-03-17 15:46:20\",\"week\":\"星期日\",\"fchh\":\"11\",\"cityid\":\"101210101\"}}";  
        try {
            JsonNode rootNode = mapper.readTree(str);
            
            JsonNode weaNode = rootNode.get("weatherinfo");
            Weather w = mapper.readValue(weaNode, Weather.class);
            
//            Weather w = parse(weaNode, Weather.class);
            
            ObjectMapper mapper2 = new ObjectMapper();    
            StringWriter sw = new StringWriter();    
            JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);    
            mapper2.writeValue(gen, w);    
            gen.close();    
            String json = sw.toString();  
            System.out.println(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果 :

{"city":"杭州","city_en":"hangzhou","date_y":"2014年1月12日","date":1458200780000,"week":"星期日","fchh":11,"cityid":"101210101"}

 

四.抽取完善实例

package com.bijian.study;

import java.io.StringWriter;
import java.text.SimpleDateFormat;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;

import com.bijian.study.dto.BaseInfoDTO;

public class JacksonDemo04 {

    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    static ObjectMapper mapper = null;
    
    static{
            mapper = new ObjectMapper();
            SimpleDateFormat fmt = new SimpleDateFormat(DATE_FORMAT);  
            mapper.setDateFormat(fmt);
            mapper.enable(Feature.WRITE_NULL_MAP_VALUES);
            mapper.enable(Feature.WRITE_EMPTY_JSON_ARRAYS);
    }

    public static <T> T parse(JsonNode root, Class<T> rootType) {
        try {
            return mapper.readValue(root, rootType);
        } catch (Exception e) {
            throw new RuntimeException("JsonNode转换" + rootType.getName() + "异常", e);
        }
    }
    
    public static void main(String[] args) {
        jacksonChangeJson();
    }
    
    private static void jacksonChangeJson() {
        
        String str = "{\"id\":\"FC75C4AE61A04B49912C789A72D47F16\",\"detailList\":[{\"id\":\"D4416D08A9CE4AB882AA7EFC3EE66B14\",\"baseInfoId\":null,\"companyCode\":\"203\",\"companyName\":\"支付宝\",\"scale\":0.85},{\"id\":\"1392C28C4C6E422983F4EACC0C52A014\",\"baseInfoId\":null,\"companyCode\":\"211\",\"companyName\":\"微信\",\"scale\":0.15}],\"mark\":\"2\"}";
        try {
            //法一:ObjectMapper的readValue方法操作JsonNode节点,一般在解析JsonNode中的子节点时用到
//            JsonNode rootNode = mapper.readTree(str);
//            BaseInfoDTO c = mapper.readValue(rootNode, BaseInfoDTO.class);
            
            //法二:ObjectMapper的readValue方法做下封装
//            JsonNode rootNode = mapper.readTree(str);
//            BaseInfoDTO c = parse(rootNode, BaseInfoDTO.class);
            
            //法三:ObjectMapper的readValue方法直接操作JSON串
            BaseInfoDTO c = mapper.readValue(str, BaseInfoDTO.class);
            
            ObjectMapper mapper2 = new ObjectMapper();    
            StringWriter sw = new StringWriter();    
            JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);    
            mapper2.writeValue(gen, c);    
            gen.close();    
            String json = sw.toString();  
            System.out.println(json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.bijian.study.dto;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class AbstractDTO {

    /**
     * 序列化
     */
    private static final long serialVersionUID = -6492889909372878745L;

    /**
     * 主键id
     */
    private String id;
    
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    
    /**
     * ToString方法
     */
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.DEFAULT_STYLE);
    }
}
package com.bijian.study.dto;

import java.util.List;

public class BaseInfoDTO extends AbstractDTO {

    /**
     * 序列化
     */
    private static final long serialVersionUID = -1354767346065648328L;
    /**
     * 详细信息描述
     */
    private List<DetailDTO> detailList;

    private String mark;

    public List<DetailDTO> getDetailList() {
        return detailList;
    }

    public void setDetailList(List<DetailDTO> detailList) {
        this.detailList = detailList;
    }

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }
}
package com.bijian.study.dto;

public class DetailDTO extends AbstractDTO {

    /**
     * 序列化
     */
    private static final long serialVersionUID = -8405894524309728426L;
    
    /**基本信息(外键)*/
    private String baseInfoId;
    private String companyCode;
    private String companyName;
    private Double scale;
    
    public String getBaseInfoId() {
        return baseInfoId;
    }
    public void setBaseInfoId(String baseInfoId) {
        this.baseInfoId = baseInfoId;
    }
    public String getCompanyCode() {
        return companyCode;
    }
    public void setCompanyCode(String companyCode) {
        this.companyCode = companyCode;
    }
    public String getCompanyName() {
        return companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public Double getScale() {
        return scale;
    }
    public void setScale(Double scale) {
        this.scale = scale;
    }
}

运行结果:

{"id":"FC75C4AE61A04B49912C789A72D47F16","detailList":[{"id":"D4416D08A9CE4AB882AA7EFC3EE66B14","baseInfoId":null,"companyCode":"203","companyName":"支付宝","scale":0.85},{"id":"1392C28C4C6E422983F4EACC0C52A014","baseInfoId":null,"companyCode":"211","companyName":"微信","scale":0.15}],"mark":"2"}

 

相关标签: Jackson json