原文链接:http://www.dubby.cn/detail.html?id=9069

我们在这里使用jackson-core提供的JsonParserJsonGenerator来实现基本的序列化和反序列化。

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相关推荐

  1. 【Jackson】jackson 语法介绍 关键字

    文章目录 1.概述 2.引入类库 3.Jackson注解 3.1 属性命名 3.2 属性包含 3.3 序列化相关 4.案例 4.1 简单映射 4.2 集合的映射 4.3 Jackson配置 4.4 用 ...

  2. java jackson maven,jackson中objectMapper的使用

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象 ObjectMapper类是Jackson库的主要类.它称为ObjectMappe ...

  3. Jackson用法详解

    Spring MVC 默认采用Jackson解析Json,尽管还有一些其它同样优秀的json解析工具,例如Fast Json.GSON,但是出于最小依赖的考虑,也许Json解析第一选择就应该是Jack ...

  4. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  5. Jackson使用详解

    本文来说下序列化框架Jackson的详细使用.Spring MVC默认采用Jackson解析Json,尽管还有一些其它同样优秀的json解析工具,例如Fast Json.GSON,但是出于最小依赖的考 ...

  6. Json学习总结(9)——放弃FastJson!Jackson的功能原来如此之牛

    什么是Jackson Jackson是比较主流的基于Java的JSON类库,可用于Json和XML与JavaBean之间的序列化和反序列化.没看错,Jackson也可以处理JavaBean与XML之间 ...

  7. Jackson 解析 JSON 详细教程

    JSON 对于开发者并不陌生,如今的 WEB 服务.移动应用.甚至物联网大多都是以 JSON 作为数据交换的格式.学习 JSON 格式的操作工具对开发者来说是必不可少的.这篇文章将介绍如何使用 Jac ...

  8. Json的FastJson与Jackson

    FastJson 需要引入 fastjson-1.2.40.jar包 FastJson的介绍 JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson ...

  9. Jackson之注解大全

    文章目录 Jackson简介 特点 POM Jackson常用注解 1. 序列化注解 1.1 @JsonAnyGetter 1.2 @JsonGetter 1.3 @JsonPropertyOrder ...

  10. jackson 官网 java_jackson

    [TOC] # 导包 Jackson包含一个core JAR,和两个依赖core JAR的JAR: * Jackson Core * Jackson Annotations * Jackson Dat ...

最新文章

  1. DeepLearning:windows环境下C++环境实现Tensorflow编译部署
  2. 一个C#程序员学习微信小程序的笔记
  3. Hadoop命令查看可以访问的queue
  4. 实时音视频助力在线教育风口
  5. 举报入口_违法和不良信息举报中心
  6. js中数组filter过滤奇偶数_JS filter()方法:根据指定条件过滤数组元素
  7. 随想录(udp经验总结)
  8. 互联网产品开发中的“快”字诀
  9. 大热的麦克风阵列语音识别系统的设计和轻松实现,提供软硬件解决方案
  10. 网关 配置内网DNS 服务器
  11. Google Code Review 处理代码审查中的推回
  12. VLSI Basic4——antenna effect天线效应
  13. a标签的href属性长度限制
  14. vue实现图片预加载的几种方式
  15. 武汉市10月双软认定好处、认定条件及9月认定名单公示
  16. 【解决方案】【亲测有效】Windows10离线安装.net3.5
  17. 一篇最通俗易懂的https
  18. 用魔法打败魔法!这件毛衣让摄像头看不到你;两款酷炫的AI写作软件;基于深度学习扩散模型的蛋白质设计;Codon开源Python编译器;基于AI生成连贯的剧本 | ShowMeAI资讯日报
  19. 计算机高级调试员操作网络题,计算机高级操作员实操步骤
  20. mysql报错-ERROR 1206 (HY000)- The total number of locks exceeds the lock table size-的解决方法

热门文章

  1. UG NX 12 对象的查看操作
  2. C++程序设计原理与实践电子书pdf下载
  3. 2022中国互联网公司100强排名
  4. 系统辨识与自适应控制期末复习
  5. status header not present 解决办法
  6. 用python实现AI换脸
  7. webots自学笔记(九)弹簧与阻尼添加
  8. sketchup/su模型导入到Unity3D
  9. pyqt5 同时显示多个画面_体育赛事直播应用NHL.TV可让屏幕同时显示6个画面,全景观看比赛...
  10. 计算机主板按那三种方法分类,如何查看计算机主板型号,几秒钟即可了解三种方法...