- 浏览: 276934 次
文章分类
最新评论
-
guji528:
oracle的统计函数真的很强大
Oracle 使用LAG和LEAD函数统计 -
haiyangyiba:
受教了
No Dialect mapping for JDBC type: 3 -
elvishehai:
能不能给个完整点的例子呀,我一直都没有试成功过,
简单的使用jackson的annotation -
miaoyue:
如果我想把name属性转成注释之后,之前的注释还在怎么做?
PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码 -
ianl_zt:
以上方法只适合在hibernate2中使用,现在hiberna ...
Hibernate的批量更新和删除
原文链接:
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();
读操作:
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()
发表评论
-
简单的使用jackson的annotation
2011-02-16 10:27 25260@JsonAutoDetect (class) 这是作用 ... -
Jackson 使用简介
2011-02-16 10:20 8101http://jackson.codehaus.org/ ... -
nexus-maven- repository-index.zip手动下载与设置
2010-04-16 14:46 12691问题描述: 在启动eclipse的时候,在maven控制 ... -
MyEclipse启动故障-Initializing Java Tooling
2010-04-16 14:43 5686最近安装新系统后,重新安装了JDK,然后启动以前安装的MyEc ... -
iframe跨域session丢失问题
2010-02-04 15:37 5547最近在做一个系统(A),需要在系统(A)中集成目前现存系统(B ... -
SSH常见问题及解决办法
2010-01-21 17:18 3820内容检索 1.警告: No configuratio ... -
SLF4J+logBack, 日志领域中的新秀
2009-04-25 13:57 3627Ceki Gülcü创造了日志领 ... -
struts2.1.6,spring2.5.6,hibernate3.3.1,annotations
2009-04-24 15:50 3108根据流程进行注意点的 ... -
用HttpClient来模拟浏览器GET POST
2009-01-09 11:37 2252一般的情况下我们都是使用IE或者Navigator浏览器来访问 ... -
java输出扭曲验证码
2008-11-07 16:43 5684import java.awt.Color; import j ... -
getOutputStream() has already been called for this
2008-11-07 16:30 2687有一个使用SerlvetResponse输出图像的例子,代码如 ... -
深入探索 高效的Java异常处理框架【转自www.bitsCN.com】
2008-11-03 11:58 2826摘要:本文从Java异常最基本的概念、语法开始讲述了Java异 ... -
Spring+Hibernate+Struts2整合文档
2008-11-03 10:44 3788一、 Spring+Hibernate整合: Spring整 ... -
Tomcat启动分析
2008-10-29 11:05 30141 - Tomcat Server的组成部 ... -
tomcat集群和负载均衡
2008-10-29 11:00 3488(一)环境说明(1)服务器 ... -
Log4j配置文件
2008-10-29 10:58 2306#配置根Logger,其语法为:log4j.rootLog ... -
c3p0连接池说明
2008-09-18 11:57 3210<c3p0-config> <def ... -
利用xfire编写webservice
2008-08-15 10:19 37701. xfire + spring 发布webserv ... -
struts + spring + xfire (组合)
2008-08-15 10:14 3916一般情况下, spring+ struts的组合,struts ... -
无所不能的“蚂蚁”--Ant(四)
2008-08-06 20:02 2264五.使用Ant运行本地程序 1.使用Ant运行windows的 ...
相关推荐
以下是关于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的书在作为参考资料方面...
学习如何使用HttpURLConnection或OkHttp发送网络请求,以及使用Gson或Jackson解析返回的JSON数据,是网络编程的基础。 12. **异步处理**:Android主线程不能执行耗时操作,否则会导致应用无响应。理解并使用...
< 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容器,如...
JSON作为数据交换格式,需要理解其结构并能使用Gson或Jackson进行解析。存储数据时,可以使用SQLite数据库或SharedPreferences进行轻量级数据保存,对于大量数据,考虑使用ContentProvider或云存储。 本书还涵盖了...
Java中可以使用如Jackson、Gson等库进行JSON的解析和序列化。 通过阅读《基于Java操作的JSON入门教程.pdf》和《JAVA-基础入门教程.pdf》,你可以深入理解这些概念,并通过实践编写简单的Java程序,逐渐熟悉这个强大...
本教程将带你入门JSON,并通过Java进行实战操作。 一、JSON基本结构 1. JSON对象:由花括号{}包围,内部包含键值对,键与值之间用冒号隔开,键值对之间用逗号分隔。键必须是字符串,而值可以是各种数据类型,如字符...
同时,如果遇到JSON或XML数据,需要了解Jackson或Gson库来解析这些结构化数据。 网络爬虫常常需要处理反爬虫策略,比如验证码、动态加载内容、IP限制等。对于这些问题,我们可能需要用到Selenium、Puppeteer等工具...
在进阶部分,文档可能包含网络编程,如使用OkHttp或Retrofit进行HTTP请求,以及使用Gson或Jackson进行JSON数据解析。还有数据库管理,如SQLite的使用,以及如何实现数据持久化。另外,可能还会涉及到异步处理,如...
此外,还会讲解网络编程,如使用HttpURLConnection或OkHttp进行网络请求,以及使用Gson或Jackson进行JSON解析。 此外,Android的生命周期管理和多线程处理也是重点内容。理解Activity和Fragment的生命周期对于避免...
2. JSON解析:将JSON数据转换为Java对象,如使用Gson或Jackson库。 3. Retrofit与RxJava:现代的网络请求库结合响应式编程,提高异步处理效率。 八、服务与广播接收器 1. Service:后台运行的服务,了解启动服务和...
- **JSON解析**:Gson或Jackson库可将JSON数据转换为Java对象,方便处理。 5. **服务与广播** - **服务(Service)**:后台运行的任务,即使用户离开应用仍能继续执行。 - **广播接收器(BroadcastReceiver)**:...
本资料"Android网络开发从入门到精通源码"由张余提供,旨在帮助开发者系统地学习并掌握Android平台上的网络编程技术。 一、Android网络基础 在Android中,我们主要通过HttpURLConnection、HttpClient(已废弃)、...
在这个名为"springboot-demo"的项目中,我们将深入探讨SpringBoot的基本概念、核心功能以及如何进行入门实践。 一、SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架,其设计目标是为了使创建独立的、生产...