- 浏览: 755528 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 1734Get the hard disk serial number ... -
Http Client 访问网页。
2012-03-16 01:03 887http://hc.apache.org/httpclient ... -
jsoup posting and cookie
2012-03-16 00:48 648http://stackoverflow.com/questi ... -
使用 jsoup 对 HTML 文档进行解析和操作(比HTMLParser好)
2012-03-15 23:01 1866jsoup 简介 Java 程序在解析 HTML 文档时 ... -
Hibernate Call SPs
2011-04-26 21:09 1118First I am going to post the Na ... -
Struts2中文乱码问题
2008-11-25 20:44 2230Struts2中文乱码问题 有一段时间没做Struts2开发了 ... -
hibernate3.04中文文档
2008-08-01 23:20 1486hibernate3.04中文文档.rar </ta ... -
spring_in_action_中文版
2008-07-31 21:25 2170[url=../../../topics/download/e ... -
AOP和AspectJ-扫盲(转)
2008-06-06 12:18 1409原贴:http://www.jdon.com/AO ... -
appfuse学习手记
2008-03-11 13:31 18681。package com.mycompany.app.dao ... -
Struts--Ajax应用例码
2007-11-09 13:10 1484js 代码 new Element.update ... -
Struts+Spring+Hibernate实现上传下载
2007-08-29 10:54 1825下载本文源代码 ... -
Spring配置代码范例
2007-07-25 17:19 1690Spring配置代码 < ... -
加载Spring的 Web.xml配置
2007-07-25 17:12 21189xml 代码 <?xml versio ... -
Commons-logging + Log4j 入门指南
2007-07-18 15:55 1263一 :为什么同时使用commons-logging和Log4j ... -
spring -struts plugin
2007-07-16 15:23 1839struts-config.xml xml 代码 ... -
Log4j设置
2007-07-16 14:49 21681.commons-logging.properties or ... -
过滤器设置
2007-07-16 14:45 14681。SetCharacterEncodingFilter 代码 ...
相关推荐
以下是关于Jackson入门的关键知识点: 1. **Streaming API**: - Jackson的Streaming API提供了一种低级、高性能的方式来处理JSON,适合大数据量或内存有限的情况。 - `JsonParser`用于读取JSON数据,而`...
这篇“Jackson快速入门”将带你快速掌握Jackson的核心功能和使用方法。 首先,我们需要了解Jackson的基本组件。核心组件包括`Jackson-databind`,它提供了`ObjectMapper`类,用于实现对象到JSON和JSON到对象的转换...
在本篇文章中,我们将通过实例来入门Jackson的使用。 一、Jackson库简介 Jackson库的核心组件包括: 1. `Jackson-databind`:提供将Java对象映射到JSON和从JSON反序列化回Java对象的功能。 2. `Jackson-core`:基础...
尽管Jackson的《Classical Electrodynamics》在某些方面可能不是最理想的入门教材,但它仍然是一个非常宝贵的资源,特别是对于那些希望深入了解经典电动力学领域的学生而言。通过系统地学习、广泛地查阅参考资料并...
然而,它并非完美的入门教材。该书在某些地方假设了读者对基础材料的熟悉度,省略了关键步骤,并且提供的实例不足。对于初学者而言,这可能是一本难以消化的书籍。然而,Jackson的野心在于他几乎涵盖了经典电磁理论...
2. 尽管该书内容详尽、研究充分,但普遍存在一个普遍观点,即该书并非一个好的入门级教材。它在某些章节假设读者已具备先验知识,跳过了一些关键步骤,并且提供的例子不够充分。 3. Jackson的书在作为参考资料方面...
JSON作为数据交换格式,需要理解其结构并能使用Gson或Jackson进行解析。存储数据时,可以使用SQLite数据库或SharedPreferences进行轻量级数据保存,对于大量数据,考虑使用ContentProvider或云存储。 本书还涵盖了...
本入门案例将带你了解如何使用Ehcache实现分布式缓存,并特别关注如何将文件数据转换为树形结构。 首先,让我们理解Ehcache的基本概念。Ehcache的核心组件包括缓存管理器(Cache Manager)、缓存(Cache)和缓存项...
本教程将带你入门JSON,并通过Java进行实战操作。 一、JSON基本结构 1. JSON对象:由花括号{}包围,内部包含键值对,键与值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是各种数据类型,如字符...
< dependency> < groupId>io.progix.jackson</ groupId> < artifactId>jackson-patch</ artifactId> < version>0.1.0</ version></ dependency> ##入门所有补丁操作都可以使用JsonPatch类的静态方法来执行。...
例如,如果检测到`spring-boot-starter-web`,那么它就会自动配置Web相关的设置,包括DispatcherServlet、Jackson JSON序列化等。 3. **嵌入式服务器(Embedded Server)**:Spring Boot 支持嵌入式Servlet容器,如...
学习如何使用HttpURLConnection或OkHttp发送网络请求,以及使用Gson或Jackson解析返回的JSON数据,是网络编程的基础。 12. **异步处理**:Android主线程不能执行耗时操作,否则会导致应用无响应。理解并使用...
GSON入门篇 一、创建一个JavaSE项目 二、IDEA中导入gson的jar包 三、创建JavaBean 四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 ...
2. JSON解析:将JSON数据转换为Java对象,如使用Gson或Jackson库。 3. Retrofit与RxJava:现代的网络请求库结合响应式编程,提高异步处理效率。 八、服务与广播接收器 1. Service:后台运行的服务,了解启动服务和...
Java中可以使用如Jackson、Gson等库进行JSON的解析和序列化。 通过阅读《基于Java操作的JSON入门教程.pdf》和《JAVA-基础入门教程.pdf》,你可以深入理解这些概念,并通过实践编写简单的Java程序,逐渐熟悉这个强大...
- **JSON解析**:Gson或Jackson库可将JSON数据转换为Java对象,方便处理。 5. **服务与广播** - **服务(Service)**:后台运行的任务,即使用户离开应用仍能继续执行。 - **广播接收器(BroadcastReceiver)**:...
同时,如果遇到JSON或XML数据,需要了解Jackson或Gson库来解析这些结构化数据。 网络爬虫常常需要处理反爬虫策略,比如验证码、动态加载内容、IP限制等。对于这些问题,我们可能需要用到Selenium、Puppeteer等工具...
在进阶部分,文档可能包含网络编程,如使用OkHttp或Retrofit进行HTTP请求,以及使用Gson或Jackson进行JSON数据解析。还有数据库管理,如SQLite的使用,以及如何实现数据持久化。另外,可能还会涉及到异步处理,如...
此外,还会讲解网络编程,如使用HttpURLConnection或OkHttp进行网络请求,以及使用Gson或Jackson进行JSON解析。 此外,Android的生命周期管理和多线程处理也是重点内容。理解Activity和Fragment的生命周期对于避免...