- 浏览: 208382 次
- 性别:
- 来自: 杭州
最新评论
-
李嘉图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 13126最近辅导黄埔的同学进行开发,发现了一些问题,隐约看到当年自己写 ... -
jmockit 的使用系列
2010-12-13 21:30 94131. 入门 2. 完整的Mock步骤 ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 21:11 4873package jmockit.sample; impo ... -
jmockit 的使用示例-03全部mock的?
2010-12-13 21:11 3642package jmockit.sample; impo ... -
jmockit 的使用示例-04静态部分mock示例
2010-12-13 21:10 3858package jmockit.sample; impo ... -
jmockit 的使用示例-06私有成员的Mock
2010-12-13 21:10 7643目标测试代码 package jm ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 21:09 4675目标测试代码 package jmockit.target ... -
jmockit 的使用示例-09构造方法也可以Mock?基于状态的Mock?
2010-12-13 21:07 10366目标测试代码 package jmockit.target ... -
jmockit 的使用示例-10另一种基于状态的Mock,随穿随脱?
2010-12-13 21:07 2701目标测试代码 package jm ... -
jmockit 的使用示例-11不是吧,还能访问实际被Mock的对象?
2010-12-13 21:07 3230目标测试代码 package jmockit.target ... -
jmockit 的使用示例-07私有静态成员Mock
2010-12-13 20:40 5880目标测试代码 package jmockit.target ... -
jmockit 的使用示例-02完整的Mock步骤
2010-12-13 20:31 1459package jmockit.sample; impo ... -
开放的心态
2010-10-02 13:56 978今天看李笑来的《把时间当作朋友》,看到一句话,“我们的大脑 ... -
解决Java应用在Linux下无法正常水印生僻字
2010-04-10 13:46 5609昨天接到一个投诉,说是他的水印是一个方框。刚开始还以为是程序出 ... -
同学们,秒投简历啦!
2010-03-12 23:51 221公司业务急速扩张,急需有才能的同学加入到我们的行列中, ... -
反编译工具
2009-12-31 20:54 1126追查JVM崩溃过程中使用到的反编译工具,其中beanutils ... -
追查JVM崩溃
2009-12-31 20:25 2236JDK升级到1.6后,服务器集群经常崩溃,后来把VM的参 ... -
普通用户下实现Apache 2.2.14与jboss-5.1.0.GA集成
2009-11-29 23:05 2761Apache与jboss集成,实际是apache与tomcat ... -
swt 笔记
2009-11-27 00:24 883http://www.ibm.com/developerwor ... -
部分XML文档模型及性能比较
2009-10-15 13:21 1079看到一篇关于XML文档的文章,介绍了各种XML模型以及它们之间 ...
相关推荐
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类的静态方法来执行。...
PHP从入门到精通光盘源码最后两章项目的源码,有需要的可以下载
快速入门只需使用BsonFactory创建Jackson的ObjectMapper即可,如下所示:ObjectMapper mapper = new ObjectMapper(new BsonFactory()); 有关更多信息,您可以阅读我的bson4jackson教程或Jackson的完整文档。 可...
GSON入门篇 一、创建一个JavaSE项目 二、IDEA中导入gson的jar包 三、创建JavaBean 四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 ...
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 . ...
审计环境介绍SQL防御原理与实际案例介绍XSS突破原理与实际案例介绍SSRF进攻原理与实际案例介绍RCE突破原理与实际案例介绍包含突破原理与实际案例...经典突破分析jackson系列经典突破分析等可能的内容顺序会略有调整...
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文将快速讲解 JSON 格式,并通过代码示例演示如何分别在客户端和服务器端进行 JSON 格式数据的处理
使用 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。 运行项目时,请确保这些文件位于类路径中。 或者,如