- 浏览: 749219 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (163)
- java-Excel (2)
- java-SSH (19)
- java-SVN (2)
- java-dwr (1)
- java-Liferay (2)
- wiki-LDAP (1)
- java-jDom (1)
- LDAP (2)
- javaScript (8)
- 数据挖掘 (1)
- java-mail (1)
- java-webService (2)
- Oracle/MySql/SqlServer2k/Sybase (3)
- db-sql (3)
- 社保 (3)
- 英语资料 (1)
- 杂谈 (31)
- 设计模式 (1)
- java-webwork (1)
- java-eclipse (3)
- java-Maven (2)
- WS/SOA/ESB (1)
- java-jfreechart (1)
- 手机开发 (4)
- linux (9)
- 搜索 (1)
- Tomcat/Weblogic (6)
- CVS/Subversion (1)
- eStore (3)
- 企业家 (0)
- java-JDBC (1)
- C/C++ (3)
- Car (2)
- Dos/Shell (1)
- 算法 (2)
- English Learning (4)
- Marriage (3)
- 心灵修行 (2)
- UML及模型设计 (0)
- 数据库设计 (1)
- 资源 (1)
- 下载 (7)
- 职业之路 (4)
- 网站安全 (1)
- StateStreet (1)
- 测试 (0)
- 性能测试 (3)
- Cloud Computing (0)
- 文档管理 (0)
- 弹性云平台 (4)
- 面试必知必会 (1)
最新评论
-
forrest_lv:
博主是其中一员?
浙江大学0X级计算机和软件学院研究生就业状况 (转) -
showtimes52007:
lz实现的拷贝方法是io的,我前几天也写了个拷贝文件的方法,只 ...
文件拷贝 -
bo_hai:
总结的很好呀!谢谢呀!S
MySql用户创建、授权以及删除 -
pengzhenyi:
对于初学者来说这本书不错滴
spring_in_action_中文版 -
soundycui:
只有6-10章节
spring_in_action_中文版
同事的一些测试结果看来,Jackson在处理Json方面性能相对占优,于是关注了下它,下方大部分从官方文档翻译过来。
原文链接:
http://jackson.codehaus.org/Tutorial
Jackson有三种处理方式:
Streaming API
- 使用org.codehaus.jackson.JsonParser 进行读操作 , 使用org.codehaus.jackson.JsonGenerator 写操作
- Jackson Streaming API有点类似 Stax API
数据绑定 它允许我们把Json转换成Java对象,也可以把Java对象转换成Json对象
- org.codehaus.jackson.map.ObjectMapper 知道如何把Json数据绑定成为(或者映射回)Java对象
树模型 通过进驻内存的树形结构来方便的访问Json数据
- 和数据绑定方式类似,树模型也使用了 org.codehaus.jackson.map.ObjectMapper进行Json数据和Java对象的绑定;只是树形结构由 org.codehaus.jackson.map.JsonNode节点组成
从使用的角度看,上述三种方式可以归纳为 :
- Streaming API是性能最优的(开销最小,最快的读写速度) 注:在我看来,操作最随心所欲的
- 数据绑定是最方便使用的
- 树形模型又是最灵活的
Java类:
- 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; }
- }
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; } }
JSon数据:
- {
- "name" : { "first" : "Joe", "last" : "Sixpack" },
- "gender" : "MALE",
- "verified" : false,
- "userImage" : "Rm9vYmFyIQ=="
- }
{ "name" : { "first" : "Joe", "last" : "Sixpack" }, "gender" : "MALE", "verified" : false, "userImage" : "Rm9vYmFyIQ==" }
Streaming API (这部分我比较关注,就先翻译下)比数据绑定的方式会快20%到30%
写操作:
- JsonFactory f = new JsonFactory();
- JsonGenerator g = f.createJsonGenerator(new File("user.json"));
- g.writeStartObject();
- g.writeObjectFieldStart("name");
- g.writeStringField("first", "Joe");
- g.writeStringField("last", "Sixpack");
- g.writeEndObject(); // for field 'name'
- g.writeStringField("gender", Gender.MALE);
- g.writeBooleanField("verified", false);
- g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?)
- byte[] binaryData = ...;
- g.writeBinary(binaryData);
- g.writeEndObject();
JsonFactory f = new JsonFactory(); JsonGenerator g = f.createJsonGenerator(new File("user.json")); g.writeStartObject(); g.writeObjectFieldStart("name"); g.writeStringField("first", "Joe"); g.writeStringField("last", "Sixpack"); g.writeEndObject(); // for field 'name' g.writeStringField("gender", Gender.MALE); g.writeBooleanField("verified", false); g.writeFieldName("userImage"); // no 'writeBinaryField' (yet?) byte[] binaryData = ...; g.writeBinary(binaryData); g.writeEndObject();
读操作:
- ReadJSON.java
- JsonFactory f = new JsonFactory();
- JsonParser jp = f.createJsonParser(new File("user.json"));
- User user = new User();
- jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
- while (jp.nextToken() != JsonToken.END_OBJECT) {
- String fieldname = jp.getCurrentName();
- jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY
- if ("name".equals(fieldname)) { // contains an object
- Name name = new Name();
- while (jp.nextToken() != JsonToken.END_OBJECT) {
- String namefield = jp.getCurrentName();
- jp.nextToken(); // move to value
- if ("first".equals(namefield)) {
- name.setFirst(jp.getText());
- } else if ("last".equals(namefield)) {
- name.setLast(jp.getText());
- } else {
- throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
- }
- }
- user.setName(name);
- } else if ("gender".equals(fieldname)) {
- user.setGender(Gender.valueOf(jp.getText()));
- } else if ("verified".equals(fieldname)) {
- user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE);
- } else if ("userImage".equals(fieldname)) {
- user.setUserImage(jp.getBinaryValue());
- } else {
- throw new IllegalStateException("Unrecognized field '"+fieldname+"'!");
- }
- }
ReadJSON.java JsonFactory f = new JsonFactory(); JsonParser jp = f.createJsonParser(new File("user.json")); User user = new User(); jp.nextToken(); // will return JsonToken.START_OBJECT (verify?) while (jp.nextToken() != JsonToken.END_OBJECT) { String fieldname = jp.getCurrentName(); jp.nextToken(); // move to value, or START_OBJECT/START_ARRAY if ("name".equals(fieldname)) { // contains an object Name name = new Name(); while (jp.nextToken() != JsonToken.END_OBJECT) { String namefield = jp.getCurrentName(); jp.nextToken(); // move to value if ("first".equals(namefield)) { name.setFirst(jp.getText()); } else if ("last".equals(namefield)) { name.setLast(jp.getText()); } else { throw new IllegalStateException("Unrecognized field '"+fieldname+"'!"); } } user.setName(name); } else if ("gender".equals(fieldname)) { user.setGender(Gender.valueOf(jp.getText())); } else if ("verified".equals(fieldname)) { user.setVerified(jp.getCurrentToken() == JsonToken.VALUE_TRUE); } else if ("userImage".equals(fieldname)) { user.setUserImage(jp.getBinaryValue()); } else { throw new IllegalStateException("Unrecognized field '"+fieldname+"'!"); } }
数据绑定:
- //读
- ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
- User user = mapper.readValue(new File("user.json"), User.class);
- //写
- mapper.writeValue(<SPAN class=code-keyword>new</SPAN>
- File(<SPAN class=code-quote>"user-modified.json"</SPAN>
- ), user);
//读 ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally User user = mapper.readValue(new File("user.json"), User.class); //写 mapper.writeValue(new File("user-modified.json" ), user);
无类型的数据绑定:
- HashMap<String,Object> untyped = new HashMap<String,Object>();
- HashMap<String,String> nameStruct = new HashMap<String,String>();
- nameStruct.put("first", "Joe");
- nameStruct.put("last", "Sixpack");
- untyped.put("name", nameStruct);
- untyped.put("gender", "MALE");
- untyped.put("verified", Boolean.FALSE);
- untyped.put("userImage", "Rm9vYmFyIQ==");
HashMap<String,Object> untyped = new HashMap<String,Object>(); HashMap<String,String> nameStruct = new HashMap<String,String>(); nameStruct.put("first", "Joe"); nameStruct.put("last", "Sixpack"); untyped.put("name", nameStruct); untyped.put("gender", "MALE"); untyped.put("verified", Boolean.FALSE); untyped.put("userImage", "Rm9vYmFyIQ==");
树模型:
可以使用Stream API或者数据绑定的方式写或者ObjectMapper读取树树结构
ObjectMapper的方式:
- ObjectMapper m = new ObjectMapper();
- // can either use mapper.readTree(JsonParser), or bind to JsonNode
- JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class);
- // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner"
- JsonNode nameNode = rootNode.path("name");
- String lastName = nameNode.path("last").getTextValue().
- if ("xmler".equalsIgnoreCase(lastName)) {
- ((ObjectNode)nameNode).put("last", "Jsoner");
- }
- // and write it out:
- m.writeValue(new File("user-modified.json"), rootNode);
ObjectMapper m = new ObjectMapper(); // can either use mapper.readTree(JsonParser), or bind to JsonNode JsonNode rootNode = m.readValue(new File("user.json"), JsonNode.class); // ensure that "last name" isn't "Xmler"; if is, change to "Jsoner" JsonNode nameNode = rootNode.path("name"); String lastName = nameNode.path("last").getTextValue(). if ("xmler".equalsIgnoreCase(lastName)) { ((ObjectNode)nameNode).put("last", "Jsoner"); } // and write it out: m.writeValue(new File("user-modified.json"), rootNode);
绝招:可以在JsonParser和JsonGenerator中直接使用数据绑定或者树模型的方式的,看一下以下方法就知道怎么用了
- JsonParser.readValueAs()
- JsonParser.readValueAsTree()
- JsonGenerator.writeObject()
- JsonGenerator.writeTree()
发表评论
-
Java 读取硬盘Serial Number[转]
2012-03-22 13:26 1694Get the hard disk serial number ... -
Http Client 访问网页。
2012-03-16 01:03 847http://hc.apache.org/httpclient ... -
jsoup posting and cookie
2012-03-16 00:48 619http://stackoverflow.com/questi ... -
使用 jsoup 对 HTML 文档进行解析和操作(比HTMLParser好)
2012-03-15 23:01 1814jsoup 简介 Java 程序在解析 HTML 文档时 ... -
Hibernate Call SPs
2011-04-26 21:09 1074First I am going to post the Na ... -
Struts2中文乱码问题
2008-11-25 20:44 2206Struts2中文乱码问题 有一段时间没做Struts2开发了 ... -
hibernate3.04中文文档
2008-08-01 23:20 1453hibernate3.04中文文档.rar </ta ... -
spring_in_action_中文版
2008-07-31 21:25 2124[url=../../../topics/download/e ... -
AOP和AspectJ-扫盲(转)
2008-06-06 12:18 1378原贴:http://www.jdon.com/AO ... -
appfuse学习手记
2008-03-11 13:31 18361。package com.mycompany.app.dao ... -
Struts--Ajax应用例码
2007-11-09 13:10 1457js 代码 new Element.update ... -
Struts+Spring+Hibernate实现上传下载
2007-08-29 10:54 1793下载本文源代码 ... -
Spring配置代码范例
2007-07-25 17:19 1661Spring配置代码 < ... -
加载Spring的 Web.xml配置
2007-07-25 17:12 21164xml 代码 <?xml versio ... -
Commons-logging + Log4j 入门指南
2007-07-18 15:55 1235一 :为什么同时使用commons-logging和Log4j ... -
spring -struts plugin
2007-07-16 15:23 1808struts-config.xml xml 代码 ... -
Log4j设置
2007-07-16 14:49 21491.commons-logging.properties or ... -
过滤器设置
2007-07-16 14:45 14291。SetCharacterEncodingFilter 代码 ...
相关推荐
Jackson 入门 Jackson 入门 Jackson 入门
NULL 博文链接:https://learnworld.iteye.com/blog/1616866
NULL 博文链接:https://rensanning.iteye.com/blog/2372409
主要介绍了Java的Jackson库的使用及其树模型入门学习教程,Jackson库通常被用来作Java对象和JSON的互相转换,需要的朋友可以参考下
< dependency> < groupId>io.progix.jackson</ groupId> < artifactId>jackson-patch</ artifactId> < version>0.1.0</ version></ dependency> ##入门所有补丁操作都可以使用JsonPatch类的静态方法来执行。...
GSON入门篇 一、创建一个JavaSE项目 二、IDEA中导入gson的jar包 三、创建JavaBean 四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 ...
PHP从入门到精通光盘源码最后两章项目的源码,有需要的可以下载
快速入门只需使用BsonFactory创建Jackson的ObjectMapper即可,如下所示:ObjectMapper mapper = new ObjectMapper(new BsonFactory()); 有关更多信息,您可以阅读我的bson4jackson教程或Jackson的完整文档。 可...
use( new Jackson ()); assets( " / " , " index.html " ); /* * Start a websocket at /ws and send back JSON: */ ws( " /ws " , ws - > { /* * Send back message: */ ws . onMessage(msg - > ws
平台选择:理解并选择合适的移动操作系统平台...JSON解析:能使用Gson、Jackson、JSONModel等进行JSON数据解析与序列化。 GPS定位:了解并实现GPS和网络定位功能,处理地理坐标转换与地图展示。 推送通知:掌握Fireb
直播用于协议的入门工具包。快速预览该项目包含一个简单的静态应用程序。 : public class App extends Jooby { { /* * Install Jackson: */ use( new Jackson ()); /* * Install LiveReload: */ use( new Live...
JSON的入门的介绍,案例的分析,使用Jackson的解析器进行讲解
用于入门工具包。 快速预览 该项目包含一个简单的应用程序,该应用程序: 使用内存数据库 插入有关应用程序启动时间的数据库记录 通过JSON路由公开数据。 : public class App extends Jooby { /* * The logging...
用于Jackson的模块添加了用于序列化和反序列化的实用程序。 入门 @JsonPropertyGroup和@JsonUsePropertyGroup 样品1 public class Customer { private String name; private String email; private String ...
用于 Spark 的 Mozilla 遥测分析入门套件 这个包提供了一个 API 来将一组遥测 ping 加载到 RDD。 以下示例打印所选 ping 的操作系统分布。 import org . apache . spark . SparkContext import org . apache . ...
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理
审计环境介绍SQL防御原理与实际案例介绍XSS突破原理与实际案例介绍SSRF进攻原理与实际案例介绍RCE突破原理与实际案例介绍包含突破原理与实际案例...经典突破分析jackson系列经典突破分析等可能的内容顺序会略有调整...
使用 Spring Boot + Elasticsearch 和基于 React 的前端的入门项目。 利用的技术 Java 8 弹簧靴 码头 9 谷歌番石榴 乔达时间 Jackson 序列化扩展 Joda 时间模块 谷歌番石榴模块 JDK 8 配置了无状态 CSRF 过滤器 ...
QuiXDM QuiXDM是一种无处不在的开源数据模型,可以以流方式进行处理: XML(通过 ) JSON格式 YAML RDF三重 四边形 CSV 硅通Kong HTML入门安装签出此代码。 符合Java 1.8+ 获得对Saxon 9.7的访问: : 获得对Jackson ...
适用于Java的TextRazor依赖于Jackson JSON库,特别是jackson-core-2.6.6.jar,jackson-annotations-2.6.6.jar,jackson-databind-2.6.6.jar。 运行项目时,请确保这些文件位于类路径中。 或者,如