`

jackJson

    博客分类:
  • java
 
阅读更多

在Java平台(StAX, JAXB等)XML处理质量和多样化的激励下,Jackson为多功能的Java JSON处理包其目标为集快捷、正确、轻量和符合人体工程学与一体。

本文将给出Jackson的功能概览。

JSON的三种处理方式 
Jackson提供了三种可选的JSON处理方法(一种方式及其两个变型):

  • 流式 API(也称为"增量分析/生成") 读取和写入 JSON 内容作为离散事件。

  • 树模型 :提供一个 JSON 文档可变内存树的表示形式。

    • org.codehaus.jackson.map.ObjectMapper 生成树 ;树组成 JsonNode 节点集。

    • 树模型类似于 XML DOM。
  • 数据绑定: JSON和POJO相互转换,基于属性访问器规约或注解。

    • 有 两种变体: 简单 和 完整 的数据绑定:

    • 简单数据绑定: 是指从Java Map、List、String、Numbers、Boolean和空值进行转换

    • 完整数据绑定 :是指从任何 Java bean 类型 (及上文所述的"简单"类型) 进行转换

    • org.codehaus.jackson.map.ObjectMapper 对两个变种,进行编组(marshalling )处理 (写入 JSON) 和反编组(unmarshalling ,读 JSON)。

    • JAXB激励下的基于注释的 (代码优先)变种。

从使用的角度来看,总结这些3 种方法的用法如下:

  • 流 API: 性能最佳的方式 (最低开销、 速度最快的读/写; 其它二者基于它实现)。

  • 数据绑定 :使用最方便的方式。

  • 树模型: 最灵活的方式。

Jackson的 org.codehaus.jackson.map.ObjectMapper "只是"将JSON 数据映射为POJO 对象 。例如,给定 JSON 数据:

{
  "name" : { "first" : "Joe", "last" : "Sixpack" },
  "gender" : "MALE",
  "verified" : false,
  "userImage" : "Rm9vYmFyIQ=="
}

1.用两行代码把它变成一个用户实例:

 ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally

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

编组为JSON同样简单

mapper.writeValue(new File("user-modified.json"), user);

 

2.Map

Map<String,Object> userData = mapper.readValue(new File("user.json"), Map.class);

 

将如何工作呢? 只定义了Map.class,未定义一般的Key/valie类型,但ObjectMapper 却知晓与Map(及List、数组、wrapper类型 )之间如何相互转换,仅是如此即可。如果它可以正确地映射到您所提供的类型,它将被映射。
 
Jackson将使用简单数据绑定的具体Java 类型包括:

 

JSON Type Java Type
object LinkedHashMap<String,Object>
array ArrayList<Object>
string String
number(no fraction) IntegerLong or BigInteger (smallest applicable)
number (fraction) BigDecimal
true|false boolean
null null

泛型的数据绑定

除绑定到POJO和简单类型外,还有一个额外的变型:绑定到泛型(类型)容器。此时,由于所谓的类型擦除(Java采用向后兼容的方式实现泛型),需要进行特殊处理,以防止使用类似 Collection<String>.class(不被编译)。

所以,热想绑定数据岛Map<String,User>,方式如下:

Map<String,User> result = mapper.readValue(src, new TypeReference<Map<String,User>>() { });

其中TypeReference只需传入泛型类型即可(此时需要匿名内部类):重要部分为<Map<String,User>>,定义要绑定的数据类型。

若不如此(仅定义Map.class),其调用等价于绑定到 Map<?,?>(亦即 “untyped” Map),如前所述。

更新:1.3版的Jackson允许利用TypeFactory实现构造类型。

树模式示例

另一种从JSON获取对象方式是构造“树”,类似于XML的DOM树。Jackson构造树的方法利用JsonNode基类,其中包含公开的通常所需的读取访问方法,实际所用的节点类型为其子类;但子类型仅在修改树时需要。

JSON树可通过流式API或ObjectMapper方式读、写。

利用 ObjectMapper,方法如下:

  1 ObjectMapper m = new ObjectMapper();
   2 // can either use mapper.readTree(JsonParser), or bind to JsonNode
   3 JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);
   4 // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"
   5 JsonNode nameNode = rootNode.path("name");
   6 String lastName = nameNode.path("last").getTextValue().
   7 if ("xmler".equalsIgnoreCase(lastName)) {
   8   ((ObjectNode)nameNode).put("last", "Jsoner");
   9 }
  10 // and write it out:
  11 m.writeValue(new File("user-modified.json"), rootNode);

 

一、入门

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

1、Java对象转换为JSON:

User user=new User(); //Java Object

ObjectMapper mapper = new ObjectMapper();

mapper.writeValueAsString(user); //返回字符串

//输出格式化后的字符串(有性能损耗)

mapper.defaultPrettyPrintingWriter().writeValueAsString(user);

mapper.writeValue(new File("c:\\user.json"), user); //指定文件写入

 

//设置序列化配置(全局),设置序列化时不输出空值.

sharedMapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

 

2、JSON反序列化为Java对象:

ObjectMapper mapper = new ObjectMapper();

//解析器支持解析单引号

mapper.configure(Feature.ALLOW_SINGLE_QUOTES,true);

//解析器支持解析结束符

mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS,true);

HashMap jsonMap = mapper.readValue(json,HashMap.class); //转换为HashMap对象

 

二、Jackson支持3种使用方式:

1、Data Binding:最方便使用.

(1)Full Data Binding:

Java代码  收藏代码
  1. private static final String MODEL_BINDING = "{\"name\":\"name1\",\"type\":1}";  
  2.     public void fullDataBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         Model user = mapper.readValue(MODEL_BINDING, Model.class);//readValue到一个实体类中.  
  5.         System.out.println(user.getName());  
  6.         System.out.println(user.getType());  
  7.     }  

Model类:

Java代码  收藏代码
  1. private static class Model{  
  2.         private String name;  
  3.         private int type;  
  4.           
  5.         public String getName() {  
  6.             return name;  
  7.         }  
  8.         public void setName(String name) {  
  9.             this.name = name;  
  10.         }  
  11.         public int getType() {  
  12.             return type;  
  13.         }  
  14.         public void setType(int type) {  
  15.             this.type = type;  
  16.         }  
  17.     }  

(2)Raw Data Binding:

Java代码  收藏代码
  1. /** 
  2.     Concrete Java types that Jackson will use for simple data binding are: 
  3.     JSON Type       Java Type 
  4.     object          LinkedHashMap<String,Object> 
  5.     array           ArrayList<Object> 
  6.     string          String 
  7.     number(no fraction) Integer, Long or BigInteger (smallest applicable) 
  8.     number(fraction)    Double(configurable to use BigDecimal) 
  9.     true|false      Boolean 
  10.     null            null 
  11.     */  
  12.     public void rawDataBinding() throws Exception{  
  13.         ObjectMapper mapper = new ObjectMapper();  
  14.         HashMap map = mapper.readValue(MODEL_BINDING,HashMap.class);//readValue到一个原始数据类型.  
  15.         System.out.println(map.get("name"));  
  16.         System.out.println(map.get("type"));  
  17.     }  

 (3)generic Data Binding:

Java代码  收藏代码
  1. private static final String GENERIC_BINDING = "{\"key1\":{\"name\":\"name2\",\"type\":2},\"key2\":{\"name\":\"name3\",\"type\":3}}";  
  2.     public void genericDataBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         HashMap<String,Model> modelMap = mapper.readValue(GENERIC_BINDING,new TypeReference<HashMap<String,Model>>(){});//readValue到一个范型数据中.  
  5.         Model model = modelMap.get("key2");  
  6.         System.out.println(model.getName());  
  7.         System.out.println(model.getType());  
  8.     }  

2、Tree Model:最灵活。

Java代码  收藏代码
  1. private static final String TREE_MODEL_BINDING = "{\"treekey1\":\"treevalue1\",\"treekey2\":\"treevalue2\",\"children\":[{\"childkey1\":\"childkey1\"}]}";  
  2.     public void treeModelBinding() throws Exception{  
  3.         ObjectMapper mapper = new ObjectMapper();  
  4.         JsonNode rootNode = mapper.readTree(TREE_MODEL_BINDING);  
  5.         //path与get作用相同,但是当找不到该节点的时候,返回missing node而不是Null.  
  6.         String treekey2value = rootNode.path("treekey2").getTextValue();//  
  7.         System.out.println("treekey2value:" + treekey2value);  
  8.         JsonNode childrenNode = rootNode.path("children");  
  9.         String childkey1Value = childrenNode.get(0).path("childkey1").getTextValue();  
  10.         System.out.println("childkey1Value:"+childkey1Value);  
  11.           
  12.         //创建根节点  
  13.         ObjectNode root = mapper.createObjectNode();  
  14.         //创建子节点1  
  15.         ObjectNode node1 = mapper.createObjectNode();  
  16.         node1.put("nodekey1",1);  
  17.         node1.put("nodekey2",2);  
  18.         //绑定子节点1  
  19.         root.put("child",node1);  
  20.         //数组节点  
  21.         ArrayNode arrayNode = mapper.createArrayNode();  
  22.         arrayNode.add(node1);  
  23.         arrayNode.add(1);  
  24.         //绑定数组节点  
  25.         root.put("arraynode", arrayNode);  
  26.         //JSON读到树节点  
  27.         JsonNode valueToTreeNode = mapper.valueToTree(TREE_MODEL_BINDING);  
  28.         //绑定JSON节点  
  29.         root.put("valuetotreenode",valueToTreeNode);  
  30.         //JSON绑定到JSON节点对象  
  31.         JsonNode bindJsonNode = mapper.readValue(GENERIC_BINDING, JsonNode.class);//绑定JSON到JSON节点对象.  
  32.         //绑定JSON节点  
  33.         root.put("bindJsonNode",bindJsonNode);  
  34.         System.out.println(mapper.writeValueAsString(root));  
  35.     }  

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字符串序列化。

 

 

 

分享到:
评论

相关推荐

    jackjson2.6 jar包

    这个"jackjson2.6 jar包"是Jackson库的一个版本,主要用于将Java对象序列化为JSON格式的数据,以及将JSON数据反序列化为Java对象。Jackson 2.6是一个较旧但仍然稳定可靠的版本,它提供了许多功能来帮助开发者在处理...

    jackJSON生成与解析JSON数据相关jar包.rar

    本压缩包“jackJSON生成与解析JSON数据相关jar包.rar”包含了在Java项目中使用JackJSON所需的库文件。 首先,JackJSON库的核心在于它的两个主要类:`org.json.JSONObject`和`org.json.JSONArray`。`JSONObject`用于...

    JSON工具包-jackjson&fastjson

    在Java开发中,有多种JSON库可以帮助开发者方便地处理JSON数据,其中两个常用的是Jackson(jackjson)和Fastjson。 **Jackson(jackjson)** Jackson是由FasterXML公司维护的一个开源项目,它提供了高效的序列化和...

    jackJson框架(java快速解析json)

    jackJson java解析json json解析 json jack java快速解析json,这个是一个完整的包,包含jackjson以及依赖包: 话说依赖包难找。 json-lib * jakarta commons-lang 2.4 * jakarta commons-beanutils 1.7.0 * ...

    JackJson.zip

    在"JackJson.zip"压缩包中,我们通常会找到以下三个重要的jar包: 1. `jackson-core.jar`:这是Jackson库的基础模块,提供了JSON流处理API。它定义了基本的JSON解析器(JsonParser)和生成器(JsonGenerator)接口...

    Jackjson.rar

    这个"Jackjson.rar"压缩包包含了Jackson库的一些关键组件的源码、文档和jar包,主要涉及以下几个方面: 1. **Jackson-databind**: Jackson-databind是Jackson库的核心部分,它负责将Java对象转换为JSON格式,以及...

    jackjson jar包

    标题中的"jackjson jar包"指的是Jackson库的特定版本,即2.4版。这个版本包含了三个核心的JAR文件,它们是Jackson库的核心组件,用于不同方面的JSON操作。 1. **Jackson Core**: 这个模块提供了基本的JSON解析和...

    jackjson类型转换各种方法

    杰克逊(Jackson)是Java领域中广泛使用的JSON处理库,它提供了强大的功能,使得JSON与其他数据类型(如Java对象)之间的转换变得简单且高效。本文将深入探讨Jackson框架在JSON转换中的各种方法,帮助你更好地理解和...

    jackjson.zip

    在给定的压缩包"jackjson.zip"中,包含的是Jackson库的三个核心组件的最新版本:`jackson-databind-2.12.4.jar`、`jackson-core-2.12.4.jar`和`jackson-annotations-2.12.4.jar`。这些组件构成了Jackson库的主要功能...

    jackjson2.2.3

    jackjson2.2.3下载

    jackjson 2.2.3 jar 全部

    杰克逊(Jackson)是Java领域中广泛使用的JSON处理库,其主要由三个核心模块组成:`jackson-core`、`jackson-annotations`和`jackson-databind`。在给定的压缩包文件中,包含了这三个模块的2.2.3版本。...

    jackJson1.7.6

    快速json解析,媲美Gson,包没有多大,适合初学者使用这个包。

    java-json:使用libs fastson,jackjson,Gson,json将Java转换为json,相反,将json转换为java

    java-json 使用libs fastson,jackjson,Gson,json将Java转换为json,相反,将json转换为java java-json 与fastJson合作 下载指令文件并根据它进行编码。

    json处理jar包合集.zip

    在Java中,处理JSON有多个流行的库,包括Gson、FastJson和JackJson。这些库提供了方便的方法来序列化Java对象为JSON字符串,以及反序列化JSON字符串回Java对象。 1. Gson Gson是Google提供的一个开源库,它能够将...

    jackson jar包 官方绿色完整版

    jackson-annotations-2.2.1.jar jackson-core-2.2.1.jar jackson-core-asl-1.8.8.jar jackson-databind-2.2.1.jar jackson-mapper-asl-1.8.8.jar jackson-module-jaxb-annotations-2.2.1.jar

    json例子源码

    fastjson gson jackjson json-lib org.json的使用例子 package ivyy.taobao.com.utils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import ...

    springboot整合Jackson实例项目-附工具类

    说明:本篇讲的是Jackson的详细用法,Jackson工具类在文章最后,直接复制粘贴即可使用。 Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被...

    jackson-databind-2.10.0.jar

    jackson-databind-2.10.0

    springmvc,mybaitis json jar包

    springmvc,mybaitis json jar包Spring各jar包详解spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar,aspects.jar, spring-portlet.jar, and spring-hibernate2.jar。 spring-src.zip就是所有的源...

    jackson json 转 map 数值科学计数法的问题解决.docx

    Jackson JSON 转 Map 之科学计数法问题解决方案 Jackson 是一个流行的 Java 库,用于将 JSON 数据转换为 Java 对象或 Map。在使用 Jackson 将 JSON 转换为 Map 的过程中,可能会遇到科学计数法的问题。...

Global site tag (gtag.js) - Google Analytics