Jackson之jackson-core
原文链接:http://www.dubby.cn/detail.html?id=9069
我们在这里使用jackson-core提供的JsonParser
和JsonGenerator
来实现基本的序列化和反序列化。
1.数据和实体类
我们先定义出JSON字符串:
{"id":123456789,"text":"我是杨正,我在http://www.dubby.cn","fromUserId":123456, "toUserId":789,"languageCode":"zh"
}
给出我们等会解析出来后承载数据的POJO:
public class TwitterEntry {long _id;String _text;int _fromUserId, _toUserId;String _languageCode;public TwitterEntry() {}public void setId(long id) {_id = id;}public void setText(String text) {_text = text;}public void setFromUserId(int id) {_fromUserId = id;}public void setToUserId(int id) {_toUserId = id;}public void setLanguageCode(String languageCode) {_languageCode = languageCode;}public long getId() {return _id;}public String getText() {return _text;}public int getFromUserId() {return _fromUserId;}public int getToUserId() {return _toUserId;}public String getLanguageCode() {return _languageCode;}public String toString() {return "[Tweet, id: " + _id + ", text: " + _text + "', from: " + _fromUserId + ", to: " + _toUserId + ", lang: " + _languageCode + "]";}
}
2.反序列化Unmarshalling(JSON->POJO)
private static TwitterEntry read(JsonParser jp) throws IOException {// 检查是否是JSONif (jp.nextToken() != JsonToken.START_OBJECT) {throw new IOException("Expected data to start with an Object");}TwitterEntry result = new TwitterEntry();// 遍历属性,并一个一个的赋值while (jp.nextToken() != JsonToken.END_OBJECT) {String fieldName = jp.getCurrentName();jp.nextToken();switch (fieldName) {case "id":result.setId(jp.getLongValue());break;case "text":result.setText(jp.getText());break;case "fromUserId":result.setFromUserId(jp.getIntValue());break;case "toUserId":result.setToUserId(jp.getIntValue());break;case "languageCode":result.setLanguageCode(jp.getText());break;default:throw new IOException("Unrecognized field '" + fieldName + "'");}}//关闭 parserjp.close();return result;}
调用地方如下:
JsonFactory jsonF = new JsonFactory();String jsonStr = "{\n" +" \"id\":123456789,\n" + " \"text\":\"我是杨正,我在http://www.dubby.cn\",\n" +" \"fromUserId\":123456, \n" +" \"toUserId\":789,\n" +" \"languageCode\":\"zh\"\n" +"}";System.out.println(jsonStr);JsonParser jp = jsonF.createParser(jsonStr);TwitterEntry entry = read(jp);System.out.println(entry.toString());
3.序列化Marshalling(POJO -> JSON)
private static void write(JsonGenerator jg, TwitterEntry entry) throws IOException {jg.writeStartObject();jg.writeNumberField("id", entry.getId());jg.writeStringField("text", entry.getText());jg.writeNumberField("fromUserId", entry.getFromUserId());jg.writeNumberField("toUserId", entry.getToUserId());jg.writeStringField("langugeCode", entry.getLanguageCode());jg.writeEndObject();jg.close();}
调用如下:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();JsonGenerator jg = jsonF.createGenerator(byteArrayOutputStream, JsonEncoding.UTF8);jg.useDefaultPrettyPrinter();write(jg, entry);System.out.println(byteArrayOutputStream.toString());
4.更多的选项
4.1 JsonFactory的选项(命名规范化)
只针对属性名
JsonFactory f = new JsonFactory();
f.disable(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES);
选项名 | 默认值 | 意义 |
---|---|---|
CANONICALIZE_FIELD_NAMES | true | 意思是一旦名字字符串从输入(字节或字符流)被解码,它将被添加到一个符号表中,以减少在下次看到同一名字时被解码的开销(由同一工厂构造的任何解析器) |
INTERN_FIELD_NAMES | true | 1、如果canonicalization被启用,这个特性决定了是否被解码的字符串是否会使用String.intern()——这个在很多时候可以提高反序列化的性能。 这样做可以进一步提高反序列化的性能,因为可以使用标识比较。2、如果字符串不会重复,或者不同的字符串数量太多(成千上万),那可能要考虑关闭这个选项,不然会占用太多的内存。 |
FAIL_ON_SYMBOL_HASH_OVERFLOW(2.4支持) | true | 由于规范化使用基于散列的方法将字节/字符序列解析为名称,所以理论上可以构造具有非常高的冲突率的名称集合。 如果是这样,哈希查找的性能可能会严重降低。 为了防止这种可能性,符号表使用启发式来基于异常高的碰撞次数来检测可能的攻击。 |
USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING(2.6支持) | true | 由于分配char []和byte []缓冲区用于内容读取/写入具有显着的影响,尤其是在处理相对较小的文档时,默认情况下JsonFactory使用SoftReference的ThreadLocal来引用BufferRecycler:这允许在多个读取/写操作。一般情况下这个选项打开对性能室友帮助的,但是在Android平台上,SoftReferences的处理是次要的,导致回收没有帮助,甚至可能只是增加了一些开销,所以可以考虑关闭。但是在关闭前请保证(a)你知道你在干什么,(b)获得可测量的性能提升。 |
4.2 JsonGenerator的选项
JsonFactory f = new JsonFactory();
f.enable(JsonGenerator.Feature.ESCAPE_NON_ASCII);
f.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
JsonGenerator g = f.createGenerator(destination);
g.enable(JsonGenerator.Feature.STRICT_DUPLICATE_DETECTION);
选项名 | 默认值 | 意义 |
---|---|---|
AUTO_CLOSE_TARGET | true | 当generator.close()调用,决定目标资源(OutputStream, Writer)是否会被自动关闭(就算这个资源不是generator创建的) |
FLUSH_PASSED_TO_STREAM | true | 确定对JsonGenerator.flush()的调用是否也将调用基础目标上的flush(); 如果禁用,flush()将仅写入未刷新的内容; 如果启用,也会调用flush()。 |
AUTO_CLOSE_JSON_CONTENT | true | |
QUOTE_FIELD_NAMES | true | |
QUOTE_NON_NUMERIC_NUMBERS | true | |
WRITE_NUMBERS_AS_STRINGS | false | |
WRITE_BIGDECIMAL_AS_PLAIN(2.3支持) | false | |
ESCAPE_NON_ASCII | false | |
STRICT_DUPLICATE_DETECTION(2.3支持) | false | |
IGNORE_UNKNOWN(2.5支持) | false |
4.3 JsonParser的选项
JsonFactory f = new JsonFactory();
f.enable(JsonParser.Feature.ALLOW_COMMENTS);
f.disable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
JsonParser p = f.createParser(jsonSource);
p.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
选项名 | 默认值 | 意义 |
---|---|---|
AUTO_CLOSE_SOURCE | true | |
ALLOW_COMMENTS | false |
对于JSON来说,支持\\ 和\**\ 风格的注释
|
ALLOW_YAML_COMMENTS | false | |
ALLOW_UNQUOTED_FIELD_NAMES | false | |
ALLOW_SINGLE_QUOTES | false | |
ALLOW_UNQUOTED_CONTROL_CHARS | false | |
ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER | false | |
ALLOW_NUMERIC_LEADING_ZEROS | false | |
ALLOW_NON_NUMERIC_NUMBERS | false | |
ALLOW_MISSING_VALUES(2.8支持) | false | |
STRICT_DUPLICATE_DETECTION(2.3支持) | false | |
IGNORE_UNDEFINED2.6支持 | false |
这里给出一个示例:
JsonFactory jsonF = new JsonFactory();String jsonStr = "{\n" +" \"id\":123456789,\n" + "//注释1\n" + "/*注释1*/\n" +" \"text\":\"我是杨正,我在http://www.dubby.cn\",\n" +" \"fromUserId\":123456, \n" +" \"toUserId\":789,\n" +" \"languageCode\":\"zh\"\n" +"}";System.out.println(jsonStr);JsonParser jp = jsonF.createParser(jsonStr);//特意在上面的JSON字符串种加入一些注释,如果在此处不开启允许注释,会报错jp.enable(JsonParser.Feature.ALLOW_COMMENTS);TwitterEntry entry = read(jp);System.out.println(entry.toString());
结果:
{"id":123456789,
//注释1
/*注释1*/"text":"我是杨正,我在http://www.dubby.cn","fromUserId":123456, "toUserId":789,"languageCode":"zh"
}
[Tweet, id: 123456789, text: 我是杨正,我在http://www.dubby.cn', from: 123456, to: 789, lang: zh]
Jackson之jackson-core相关推荐
- 【Jackson】jackson 语法介绍 关键字
文章目录 1.概述 2.引入类库 3.Jackson注解 3.1 属性命名 3.2 属性包含 3.3 序列化相关 4.案例 4.1 简单映射 4.2 集合的映射 4.3 Jackson配置 4.4 用 ...
- java jackson maven,jackson中objectMapper的使用
Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象 ObjectMapper类是Jackson库的主要类.它称为ObjectMappe ...
- Jackson用法详解
Spring MVC 默认采用Jackson解析Json,尽管还有一些其它同样优秀的json解析工具,例如Fast Json.GSON,但是出于最小依赖的考虑,也许Json解析第一选择就应该是Jack ...
- 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)
Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...
- Jackson使用详解
本文来说下序列化框架Jackson的详细使用.Spring MVC默认采用Jackson解析Json,尽管还有一些其它同样优秀的json解析工具,例如Fast Json.GSON,但是出于最小依赖的考 ...
- Json学习总结(9)——放弃FastJson!Jackson的功能原来如此之牛
什么是Jackson Jackson是比较主流的基于Java的JSON类库,可用于Json和XML与JavaBean之间的序列化和反序列化.没看错,Jackson也可以处理JavaBean与XML之间 ...
- Jackson 解析 JSON 详细教程
JSON 对于开发者并不陌生,如今的 WEB 服务.移动应用.甚至物联网大多都是以 JSON 作为数据交换的格式.学习 JSON 格式的操作工具对开发者来说是必不可少的.这篇文章将介绍如何使用 Jac ...
- Json的FastJson与Jackson
FastJson 需要引入 fastjson-1.2.40.jar包 FastJson的介绍 JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson ...
- Jackson之注解大全
文章目录 Jackson简介 特点 POM Jackson常用注解 1. 序列化注解 1.1 @JsonAnyGetter 1.2 @JsonGetter 1.3 @JsonPropertyOrder ...
- jackson 官网 java_jackson
[TOC] # 导包 Jackson包含一个core JAR,和两个依赖core JAR的JAR: * Jackson Core * Jackson Annotations * Jackson Dat ...
最新文章
- DeepLearning:windows环境下C++环境实现Tensorflow编译部署
- 一个C#程序员学习微信小程序的笔记
- Hadoop命令查看可以访问的queue
- 实时音视频助力在线教育风口
- 举报入口_违法和不良信息举报中心
- js中数组filter过滤奇偶数_JS filter()方法:根据指定条件过滤数组元素
- 随想录(udp经验总结)
- 互联网产品开发中的“快”字诀
- 大热的麦克风阵列语音识别系统的设计和轻松实现,提供软硬件解决方案
- 网关 配置内网DNS 服务器
- Google Code Review 处理代码审查中的推回
- VLSI Basic4——antenna effect天线效应
- a标签的href属性长度限制
- vue实现图片预加载的几种方式
- 武汉市10月双软认定好处、认定条件及9月认定名单公示
- 【解决方案】【亲测有效】Windows10离线安装.net3.5
- 一篇最通俗易懂的https
- 用魔法打败魔法!这件毛衣让摄像头看不到你;两款酷炫的AI写作软件;基于深度学习扩散模型的蛋白质设计;Codon开源Python编译器;基于AI生成连贯的剧本 | ShowMeAI资讯日报
- 计算机高级调试员操作网络题,计算机高级操作员实操步骤
- mysql报错-ERROR 1206 (HY000)- The total number of locks exceeds the lock table size-的解决方法
热门文章
- UG NX 12 对象的查看操作
- C++程序设计原理与实践电子书pdf下载
- 2022中国互联网公司100强排名
- 系统辨识与自适应控制期末复习
- status header not present 解决办法
- 用python实现AI换脸
- webots自学笔记(九)弹簧与阻尼添加
- sketchup/su模型导入到Unity3D
- pyqt5 同时显示多个画面_体育赛事直播应用NHL.TV可让屏幕同时显示6个画面,全景观看比赛...
- 计算机主板按那三种方法分类,如何查看计算机主板型号,几秒钟即可了解三种方法...