- 浏览: 211842 次
- 性别:
- 来自: 杭州
最新评论
-
李嘉图0624:
第一段代码就出错了,少了g.close();不关闭的话,也没有 ...
Jackson 入门 -
daichangfu:
不光是生僻字需要,正常的也需要啊。
解决Java应用在Linux下无法正常水印生僻字 -
yaoweinan:
不错
JGroup配置笔记 -
learnworld:
grandboy 写道我想json的数据多一些对于数据绑定回j ...
Jackson 入门 -
grandboy:
我想json的数据多一些对于数据绑定回javabean时不会出 ...
Jackson 入门
同事的一些测试结果看来,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; } }
JSon数据:
{ "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();
读操作:
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(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==");
树模型:
可以使用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);
绝招:可以在JsonParser和JsonGenerator中直接使用数据绑定或者树模型的方式的,看一下以下方法就知道怎么用了
- JsonParser.readValueAs()
- JsonParser.readValueAsTree()
- JsonGenerator.writeObject()
- JsonGenerator.writeTree()
评论
3 楼
李嘉图0624
2015-06-21
第一段代码就出错了,少了g.close();不关闭的话,也没有刷新,文件里面的内容就会写不进去。
2 楼
learnworld
2012-08-02
grandboy 写道
我想json的数据多一些对于数据绑定回javabean时不会出错,不知道有没有办法?
可以,对应的javabean使用注解@JsonIgnoreProperties(ignoreUnknown = true)
1 楼
grandboy
2012-07-14
我想json的数据多一些对于数据绑定回javabean时不会出错,不知道有没有办法?
发表评论
-
开发新手通用代码问题
2011-06-04 06:32 14125最近辅导黄埔的同学进行开发,发现了一些问题,隐约看到当年自己写 ... -
jmockit 的使用系列
2010-12-13 21:30 94721. 入门 2. 完整的Mock步骤 ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 21:11 4923package jmockit.sample; impo ... -
jmockit 的使用示例-03全部mock的?
2010-12-13 21:11 3683package jmockit.sample; impo ... -
jmockit 的使用示例-04静态部分mock示例
2010-12-13 21:10 3902package jmockit.sample; impo ... -
jmockit 的使用示例-06私有成员的Mock
2010-12-13 21:10 7746目标测试代码 package jm ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 21:09 4764目标测试代码 package jmockit.target ... -
jmockit 的使用示例-09构造方法也可以Mock?基于状态的Mock?
2010-12-13 21:07 10455目标测试代码 package jmockit.target ... -
jmockit 的使用示例-10另一种基于状态的Mock,随穿随脱?
2010-12-13 21:07 2735目标测试代码 package jm ... -
jmockit 的使用示例-11不是吧,还能访问实际被Mock的对象?
2010-12-13 21:07 3278目标测试代码 package jmockit.target ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 20:40 5941目标测试代码 package jmockit.target ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 20:31 1489package jmockit.sample; impo ... -
开放的心态
2010-10-02 13:56 1017今天看李笑来的《把时间当作朋友》,看到一句话,“我们的大脑 ... -
解决Java应用在Linux下无法正常水印生僻字
2010-04-10 13:46 5714昨天接到一个投诉,说是他的水印是一个方框。刚开始还以为是程序出 ... -
同学们,秒投简历啦!
2010-03-12 23:51 221公司业务急速扩张,急需有才能的同学加入到我们的行列中, ... -
反编译工具
2009-12-31 20:54 1188追查JVM崩溃过程中使用到的反编译工具,其中beanutils ... -
追查JVM崩溃
2009-12-31 20:25 2279JDK升级到1.6后,服务器集群经常崩溃,后来把VM的参 ... -
普通用户下实现Apache 2.2.14与jboss-5.1.0.GA集成
2009-11-29 23:05 2801Apache与jboss集成,实际是apache与tomcat ... -
swt 笔记
2009-11-27 00:24 926http://www.ibm.com/developerwor ... -
部分XML文档模型及性能比较
2009-10-15 13:21 1116看到一篇关于XML文档的文章,介绍了各种XML模型以及它们之间 ...
相关推荐
以下是关于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团队提供的全新框架,其设计目标是为了使创建独立的、生产...