使用Jackson在Java中处理JSON

        在工作中实际使用到Java处理JSON的情况,且有很大部分都使用的是开源工具Jackson实现的。

一.入门

        Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。

1.Java对象转换为JSON

Student st=new Student(); //Java Object
ObjectMapper mapper = new ObjectMapper();
java.text.DateFormat myFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.getSerializationConfig().setDateFormat(myFormat);
try {
    //返回字符串
    String res = mapper.writeValueAsString(st);
    System.out.println(res);
    
    //输出格式化后的字符串(有性能损耗)
    res = mapper.defaultPrettyPrintingWriter().writeValueAsString(st);
    System.out.println(res);
    
    mapper.writeValue(new File("D:\\st.json"), st); //指定文件写入
     
    //设置序列化配置(全局),设置序列化时不输出空值.
    mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
    
    res = mapper.writeValueAsString(st);
    System.out.println(res);
} catch (Exception e) {
    e.printStackTrace();
}

2.JSON反序列化为Java对象

String json = "{\"error\":0,\"data\":{\"name\":\"ABC\",\"age\":20,\"phone\":{\"home\":\"abc\",\"mobile\":\"def\"},\"friends\":[{\"name\":\"DEF\",\"phone\":{\"home\":\"hij\",\"mobile\":\"klm\"}},{\"name\":\"GHI\",\"phone\":{\"home\":\"nop\",\"mobile\":\"qrs\"}}]},\"other\":{\"nickname\":[]}}";
ObjectMapper mapper = new ObjectMapper();
//解析器支持解析单引号
mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
//解析器支持解析结束符
mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
try {
    //转换为HashMap对象
    HashMap jsonMap = mapper.readValue(json, HashMap.class);
    Map<String, Map<String, Object>> maps = objectMapper.readValue(json, Map.class);
    System.out.println(maps.get("error"));//0
    System.out.println((Object) (maps.get("data").get("phone")));//{home=abc, mobile=def}
} catch (Exception e) {
    e.printStackTrace();
}

二.Jackson支持三种使用方式

1.Data Binding:最方便使用

(1)Full Data Binding

/*
 * Full Data Binding
 */
public static void fullDataBinding() {

    ObjectMapper mapper = new ObjectMapper();
    try {
        Model model = mapper.readValue(MODEL_BINDING, Model.class);
        //readValue到一个实体类中.  
        System.out.println(model.getName()); //name1 
        System.out.println(model.getType()); //1
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static class Model {
    private String name;
    private int type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}

(2)Raw Data Binding

/*
 * Raw Data Binding
 */
public static void rawDataBinding() {
    ObjectMapper mapper = new ObjectMapper();
    try {
        HashMap map = mapper.readValue(MODEL_BINDING, HashMap.class);//readValue到一个原始数据类型.  
        System.out.println(map.get("name")); //name1
        System.out.println(map.get("type")); //1
    } catch (Exception e) {
        e.printStackTrace();
    }
}

(3)generic Data Binding

/*
 * generic Data Binding
 */
public static void genericDataBinding() {
    
    ObjectMapper mapper = new ObjectMapper();
    try {
        HashMap<String, Model> modelMap = mapper.readValue(GENERIC_BINDING,
                new TypeReference<HashMap<String, Model>>() {
                });//readValue到一个范型数据中.  
        Model model = modelMap.get("key2");
        System.out.println(model.getName()); //name3
        System.out.println(model.getType()); //3
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2.Tree Model:最灵活

/*
 * Tree Model:最灵活
 */
public static void treeModelBinding() {
    ObjectMapper mapper = new ObjectMapper();
    try {
        JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);
        //path与get作用相同,但是当找不到该节点的时候,返回missing node而不是Null.  
        String treekey2value = rootNode.path("treekey2").getTextValue();//  
        System.out.println("treekey2value:" + treekey2value);
        JsonNode childrenNode = rootNode.path("children");
        String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();
        System.out.println("childkey1Value:" + childkey1Value);

        //创建根节点  
        ObjectNode root = mapper.createObjectNode();
        //创建子节点1  
        ObjectNode node1 = mapper.createObjectNode();
        node1.put("nodekey1", 1);
        node1.put("nodekey2", 2);
        //绑定子节点1  
        root.put("child", node1);
        //数组节点  
        ArrayNode arrayNode = mapper.createArrayNode();
        arrayNode.add(node1);
        arrayNode.add(1);
        //绑定数组节点  
        root.put("arraynode", arrayNode);
        //JSON读到树节点  
        JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);
        //绑定JSON节点  
        root.put("valuetotreenode", valueToTreeNode);
        //JSON绑定到JSON节点对象  
        JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//绑定JSON到JSON节点对象.  
        //绑定JSON节点  
        root.put("bindJsonNode", bindJsonNode);
        System.out.println(mapper.writeValueAsString(root));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.Streaming API。最佳性能

见官方文档例子。

进一步学习资料:

1.http://wiki.fasterxml.com/JacksonInFiveMinutes Jackson官方教程示例

2.http://wiki.fasterxml.com/JacksonJavaDocs Jackson在线API文档

3.http://hjg1988.iteye.com/blog/561368 JSON工具性能比较:json-lib和jackson进行Java对象到json字符串序列化。

文章来源:http://shensy.iteye.com/blog/1717776

猜你喜欢

转载自bijian1013.iteye.com/blog/2284395