关于jackson:Jackson工具类

import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.JavaType;import com.fasterxml.jackson.databind.ObjectMapper;import java.util.List;import java.util.Map;/** * Jackson工具类 */public class JacksonUtil { private static final ObjectMapper mapper = new ObjectMapper(); public static String bean2Json(Object data) { try { return mapper.writeValueAsString(data); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } public static <T> T json2Bean(String jsonData, Class<T> beanType) { try { return mapper.readValue(jsonData, beanType); } catch (Exception e) { e.printStackTrace(); } return null; } public static <T> List<T> json2List(String jsonData, Class<T> beanType) { JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType); try { return mapper.readValue(jsonData, javaType); } catch (Exception e) { e.printStackTrace(); } return null; } public static <K, V> Map<K, V> json2Map(String jsonData, Class<K> keyType, Class<V> valueType) { JavaType javaType = mapper.getTypeFactory().constructMapType(Map.class, keyType, valueType); try { return mapper.readValue(jsonData, javaType); } catch (Exception e) { e.printStackTrace(); } return null; }}

October 23, 2020 · 1 min · jiezi

关于jackson:再爆安全漏洞这次轮到Jackson了竟由阿里云上报

冤冤相报何时了,得饶人处且饶人。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 ✍前言你好,我是YourBatman。 明天中午收到我司安全部发了一封邮件:Jackson存在安全漏洞。查了一下,这件事并不算很陈腐了(曾经过了10天的样子),本文来聊聊吧。 说起来还蛮戏剧化:阿里云向Jackson官网提交了一个Jackson序列化安全漏洞。家喻户晓,在国内对于JSON库应用有两大次要营垒:国内驰名的Jackson库和国内阿里巴巴出品的Fastjson。 同样的功能定位,不存在竞争想想也感觉不可能嘛。所以当我看到这个破绽竟是阿里云上报的,就感觉这关系还蛮奥妙呢,默默的腹黑了3秒钟,哈哈。 附:FasterXML/jackson-databind是一个简略基于Java利用库,Jackson能够轻松的将Java对象转换成json对象和xml文档,同样也能够将json、xml转换成Java对象。Jackson是美国FasterXML公司的一款实用于Java的数据处理工具。jackson-databind是其中的一个具备数据绑定性能的组件。 ✍注释相熟A哥的小伙伴晓得,自从Fastjson上次爆出重大安全漏洞之后,我彻底的投入到了Jackson的营垒,工作中也缓缓去Fastjson化。这不还专门撰写了一篇文章来阐明此事:Fastjson到了说再见的时候了。为了顺利完成“迁徙”,我还专门写了一个,也有可能是全网惟一一个Jackson专栏,尽管很小众但就是干了~ 对于本次破绽2020年8月25日,jackson-databind(官网)公布了Jackson-databind序列化破绽的平安通告,破绽编号为CVE-2020-24616。 破绽详情该破绽源于不平安的反序列化。近程攻击者可通过精心结构的歹意载荷利用该破绽在零碎执行任意代码。 其实上它的底层原理是利用某些类的反序列化利用链,能够绕过 jackson-databind 黑名单限度,近程攻击者通过向应用该组件的web服务接口发送特制申请包(精心结构的JSON),能够造成近程代码执行影响。 破绽评级评定形式等级威逼等级高危影响面无限破绽评分75对此评级没有概念?那就来个参照物比一比嘛,我把Fastjson上次(2020-05)的安全漏洞评级给你做比照: 评定形式等级威逼等级高危影响面宽泛破绽评分75无限和宽泛的的区别到底有多大,用文字不太好形容。打个比方,我感觉可类比艾滋病和新冠病毒的区别,前者对社会生态影响并不大,而后者巴不得让寰球都停摆了,即便它致死率还远没有前者那么高,这就是影响范畴的“力量”。 影响版本jackson-databind < 2.9.10.6 因为当初大家都基于Spring Boot开发,针对版本号我扩大一下,不便你对号入座哈: Spring Boot版本Jackson版本1.5.22.RELEASE2.8.x2.0.9.RELEASE2.9.x2.1.16.RELEASE2.9.10.52.2.9.RELEASE2.10.x2.3.3.RELEASE2.11.xSpring Boot2.1.x应该是现行支流应用版本,因而从版本号上来看,大概率都在此次破绽的射程范畴内。 平安版本jackson-databind 2.9.10.6或者2.10.x及当前版本 故事时间轴2020-08-05,阿里云平安组同学向Jackson官网上报了这个安全漏洞:当天,官网回复预计会在8-15左右公布bug修复版本修复次问题(waht?晓得问题了还得10后修复?):可后果是10天都不止。直到8.25这天,Jackson公布2.9.10.6版本修复了此问题,并向外界发布告颁布此破绽: 从8.5号Jackson官网通晓此破绽,到8.25号最终发版解决此问题,整整20天,为何须要这么久?我想真像只有一个:此破绽影响真的不大,或者说影响范畴较窄。回顾下上次Fastjson呈现的那个安全漏洞,24h内就给与了修复版本,并不是因为咱们反映迅速,而是因为影响重大等不了... 修复倡议一股脑的全副降级到2.9.10.6或以上版本当然能躲避此平安问题,然而你是否想过,你负责多少个服务?你团队、公司一共有多少个服务?你品,你细品,头大吗? 从官网对此次破绽做出的反射弧工夫来看,本次破绽影响是绝对较小的,因而我总结了下修复倡议,假使你同时满足如下三个条件,那么须要立马修复,否则可暂不理睬: 对公网提供API接口Jackson版本小于2.9.10.6工程内有应用(或者引入)如下4个类任意一个: br.com.anteros.dbcp.AnterosDBCPDataSourcecom.pastdev.httpcomponents.configuration.JndiConfigurationcom.nqadmin.rowset.JdbcRowSetImplorg.arrah.framework.rdbms.UpdatableJdbcRowsetImpl条件3的实践撑持是我比照2.9.10.6版本release改变源码 + 我和我司平安组人员的探讨后果。修复计划也仅仅是在黑名单里新增了这4个类,截图如下: ✍总结在行看热闹,外行看门道。千万不能说Fastjson出了个破绽,Jackson也来一个就得出结论说打平手了,那会稍显在行。正所谓假如能够大胆,但小心求证,下结论须要审慎。 总的来说,此次破绽影响甚小,不必少见多怪,我就持续我的Jackson之旅啦。 ✔举荐浏览:Fastjson到了说再见的时候了1. 初识Jackson -- 世界上最好的JSON库2. 妈呀,Jackson原来是这样写JSON的3. 懂了这些,方敢在简历上说会用Jackson写JSON4. JSON字符串是如何被解析的?JsonParser理解一下5. JsonFactory工厂而已,还蛮有料,这是我没想到的6. 二十不惑,ObjectMapper应用也不再蛊惑7. Jackson用树模型解决JSON是必备技能,不信你看♥关注A哥♥AuthorA哥(YourBatman)集体站点www.yourbatman.cnE-mailyourbatman@qq.com微 信fsx641385712沉闷平台 公众号BAT的乌托邦(ID:BAT-utopia)常识星球BAT的乌托邦每日文章举荐每日文章举荐

September 4, 2020 · 1 min · jiezi

关于jackson:7-Jackson用树模型处理JSON是必备技能不信你看

每棵大树,都曾只是一粒种子。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 ✍前言你好,我是YourBatman。 上篇文章 体验了一把ObjectMapper在数据绑定方面的利用,用起来还是蛮不便的有木有,为啥不少人说它难用呢,着实费解。我群里问了问,次要起因是它不是静态方法调用,并且办法名获得不那么见名之意...... 尽管ObjectMapper在数据绑定上既能够解决简略类型(如Integer、List、Map等),也能解决齐全类型(如POJO),看似无所不能。然而,若有如下场景它仍旧不太好实现: 硕大的JSON串中我只想要某一个(某几个)属性的值而已长期应用,我并不想创立一个POJO与之对应,只想间接应用值即可(类型转换什么的我本人来就好)数据结构高度动态化为了解决这些问题,Jackson提供了弱小的树模型 API供以应用,这也就是本文的次要的内容。 小贴士:树模型尽管是jackson-core模块里定义的,然而是由jackson-databind高级模块提供的实现版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE✍注释树模型可能比数据绑定更不便,更灵便。特地是在构造高度动静或者不能很好地映射到Java类的状况下,它就显得更有价值了。 树模型树模型是JSON数据内存树的示意模式,这是最灵便的办法,它就相似于XML的DOM解析器。Jackson提供了树模型API来生成和解析 JSON串,次要用到如下三个外围类: JsonNodeFactory:顾名思义,用来结构各种JsonNode节点的工厂。例如对象节点ObjectNode、数组节点ArrayNode等等JsonNode:示意json节点。能够往里面塞值,从而最终结构出一颗json树ObjectMapper:实现JsonNode和JSON字符串的互转这里有个萌新的概念:JsonNode。它贯通于整个树模型中,所以有必要先来意识它。 JsonNodeJSON节点,可类比XML的DOM树节点构造来辅助了解。JsonNode是所有JSON节点的基类,它是一个抽象类,它有一个较大的特点:绝大多数的get办法均放在了此抽象类里(即便它没有实现),目标是:在不进行类型强制转换的状况下遍历构造。然而,大多数的批改办法都必须通过特定的子类类型去调用,这其实是正当的。因为在构建/批改某个Node节点时,类型类型信息个别是明确的,而在读取Node节点时大多数时候并不 太关怀节点类型。 多个JsonNode节点形成Jackson实现的JSON树模型的根底,它是流式API中com.fasterxml.jackson.core.TreeNode接口的实现,同时它还实现了Iterable迭代器接口。 public abstract class JsonNode extends JsonSerializable.Base implements TreeNode, Iterable<JsonNode> { ...}JsonNode的继承图谱如下(局部):高深莫测了吧,基本上每个数据类型都会有一个JsonNode的实现类型对应。譬如数组节点ArrayNode、数字节点NumericNode等等。 个别状况下,咱们并不需要通过new关键字去构建一个JsonNode实例,而是借助JsonNodeFactory工厂来做。 JsonNodeFactory构建JsonNode工厂类。话不多说,用几个例子跑一跑。 值类型节点(ValueNode)此类节点均为ValueNode的子类,特点是:一个节点示意一个值。 @Testpublic void test1() { JsonNodeFactory factory = JsonNodeFactory.instance; System.out.println("------ValueNode值节点示例------"); // 数字节点 JsonNode node = factory.numberNode(1); System.out.println(node.isNumber() + ":" + node.intValue()); // null节点 node = factory.nullNode(); System.out.println(node.isNull() + ":" + node.asText()); // missing节点 node = factory.missingNode(); System.out.println(node.isMissingNode() + "_" + node.asText()); // POJONode节点 node = factory.pojoNode(new Person("YourBatman", 18)); System.out.println(node.isPojo() + ":" + node.asText()); System.out.println("---" + node.isValueNode() + "---");}运行程序,输入: ...

August 25, 2020 · 2 min · jiezi

关于jackson:6-二十不惑ObjectMapper使用也不再迷惑

一滴水,用显微镜看,也是一个大世界。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 ✍前言各位好,我是YourBatman。从本文起,终于要和Jackson的“高级”局部打交道了,也就是数据绑定jackson-databind模块。通过接触它的高级API,你会继续的发现,后面花那么多篇幅讲的core外围局部是无价之宝的。毕竟村上春树也通知过咱们:人生没有无用的经验嘛。 jackson-databind蕴含用于Jackson数据处理器的通用 数据绑定性能和树模型。它构建在Streaming API之上,并应用Jackson注解进行配置。它就是Jackson提供的高层API,是开发者应用得最多的形式,因而重要水平可见一斑。 尽管Jackson最后的用例是JSON数据绑定,但当初它也能够用于其它数据格式,只有存在解析器和生成器实现即可。但须要留神的是:类的命名在很多中央仍旧应用了“JSON”这个词(比方JsonGenerator),只管它与JSON格局没有理论的硬依赖关系。 小贴士:底层流式API应用的I/O进行输入输出,因而实践上是反对任何格局的 版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE从本文开始,新增导包: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId></dependency>Tips:jackson-databind模块它强依赖于jackson-core和jackson-annotations,只须要导入此包,另外两个它主动会帮带进来。 这里须要阐明几句:咱们晓得core包中还有个jackson-annotations,难道不讲了吗?其实不是,是因为独自讲jackson-annotations并无意义,毕竟注解还得靠数据绑定模块来解析,所以先搞定这个后再杀回去。✍注释据我理解,很多小伙伴对Jackson的理解起源于ObjectMapper,止于ObjectMapper。那行,作为接触它的第一篇文章咱们就轻松点,以利用为主来整体的意识它。 性能介绍ObjectMapper是jackson-databind模块最为重要的一个类,它实现了coder对数据绑定的简直所有性能。它是面向用户的高层API,底层依赖于Streaming API来实现读/写。ObjectMapper次要提供的性能点如下: 它提供读取和写入JSON的性能(最重要的性能) 一般POJO的序列化/反序列化JSON树模型的读/写它能够被高度定制,以应用不同格调的JSON内容 应用Feature进行定制应用可插拔com.fasterxml.jackson.databind.Module模块来扩大/丰盛性能它还反对更高级的对象概念:比方多态泛型、对象标识它还充当了更为高级(更弱小)的API:ObjectReader和ObjectWriter的工厂 ObjectReader和ObjectWriter底层亦是依赖于Streaming API实现读写只管绝大部分的读/写API都通过ObjectMapper裸露进来了,但有些性能函数还是只放在了ObjectReader/ObjectWriter里,比方对于读/写 长序列 的能力你只能通过ObjectReader#readValues(InputStream) / ObjectWriter#writeValues(OutputStream)去解决,这是设计者无意为之,毕竟这种case很少很少,没必要和罕用的对付在一起嘛。 数据绑定数据绑定分为简略数据绑定和齐全数据绑定: 简略数据绑定:比方绑定int类型、List、Map等…@Testpublic void test1() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); // 绑定简略类型 和 Map类型 Integer age = objectMapper.readValue("1", int.class); Map map = objectMapper.readValue("{\"name\": \"YourBatman\"}", Map.class); System.out.println(age); System.out.println(map);}运行程序,输入: 1{name=YourBatman}齐全数据绑定:绑定到任意的Java Bean对象…筹备一个POJO: @Data@NoArgsConstructor@AllArgsConstructorpublic class Person { private String name; private Integer age;}绑定数据到POJO: ...

August 24, 2020 · 2 min · jiezi

关于jackson:5-JsonFactory工厂而已还蛮有料这是我没想到的

少年易学老难成,一寸时光不可轻。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位好,我是YourBatman。后面用四篇文章介绍完了Jackson底层流式API的读(JsonParser)、写(JsonGenerator)操作,咱们分明的晓得,这哥俩都是abstract抽象类,应用时并没有显示的去new它们的(子类)实例,均通过一个工厂来搞定,这便就是本文的配角JsonFactory。 通过名称就晓得,这是工厂设计模式。Jackson它并不倡议你间接new读/写实例,因为那过于麻烦。为了对使用者屏蔽这些简单的结构细节,于是就有了JsonFactory实例工厂的呈现。 可能有的人会说,一个对象工厂有什么好理解的,很简略嘛。非也非也,一件事件自身的复杂度并不会凭空隐没,而是从一个中央转移到另外一个中央,这另外一个中央指的就是JsonFactory。因而依照本系列的定位,理解它你绕不过来。 版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE注释JsonFactory是Jackson的(最)次要工厂类,用于 配置和构建JsonGenerator和JsonParser,这个工厂实例是线程平安的,因而能够重复使用。 作为一个实例工厂,它最重要的职责当然是创立实例对象。本工厂职责并不繁多,它负责读、写两种实例的创立工作。 创立JsonGenerator实例JsonGenerator它负责向目的地写数据,因而强调的是目的地在哪?如何写? 如截图所示,一共有六个重载办法用于构建JsonGenerator实例,多个重载办法目标是对使用者敌对,咱们能够认为最终成果是一样的。比方,底层实现是: JsonFactory: @Override public JsonGenerator createGenerator(OutputStream out, JsonEncoding enc) throws IOException { IOContext ctxt = _createContext(out, false); ctxt.setEncoding(enc); // 如果编码是UTF-8 if (enc == JsonEncoding.UTF8) { return _createUTF8Generator(_decorate(out, ctxt), ctxt); } // 应用指定的编码把OutputStream包装为一个writer Writer w = _createWriter(out, enc, ctxt); return _createGenerator(_decorate(w, ctxt), ctxt); }这就解释了,为何在详解JsonGenerator的这篇文章中,我始终以UTF8JsonGenerator作为实例进行解说,因为例子中指定的编码就是UTF-8嘛。当然,即便你本人不显示的指定编码集,默认状况下Jackson也是应用UTF-8: JsonFactory: @Override public JsonGenerator createGenerator(OutputStream out) throws IOException { return createGenerator(out, JsonEncoding.UTF8); }示例: ...

August 20, 2020 · 2 min · jiezi

关于jackson:4-JSON字符串是如何被解析的JsonParser了解一下

公司不是你家,领导不是你妈。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位好,我是A哥(YourBatman)。上篇文章:3. 懂了这些,方敢在简历上说会用Jackson写JSON 聊完,流式API的写局部能够认为你已齐全把握了,本文理解它读的局部。 版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE小贴士:截止到本文,本系列后面所有示例都只仅仅导入jackson-core而已,后续若要新增jar包我会额定阐明,否则雷同注释什么叫读JSON?就是把一个JSON 字符串 解析为对象or树模型嘛,因而也称作解析JSON串。Jackson底层流式API应用JsonParser来实现JSON字符串的解析。 最简应用Demo筹备一个POJO: @Datapublic class Person { private String name; private Integer age;}测试用例:把一个JSON字符串绑定(封装)进一个POJO对象里 @Testpublic void test1() throws IOException { String jsonStr = "{\"name\":\"YourBatman\",\"age\":18}"; Person person = new Person(); JsonFactory factory = new JsonFactory(); try (JsonParser jsonParser = factory.createParser(jsonStr)) { // 只有还没完结"}",就始终读 while (jsonParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { jsonParser.nextToken(); person.setName(jsonParser.getText()); } else if ("age".equals(fieldname)) { jsonParser.nextToken(); person.setAge(jsonParser.getIntValue()); } } System.out.println(person); }}运行程序,输入: ...

July 28, 2020 · 5 min · jiezi

关于jackson:4-JSON字符串是如何被解析的JsonParser了解一下

公司不是你家,领导不是你妈。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位好,我是A哥(YourBatman)。上篇文章:3. 懂了这些,方敢在简历上说会用Jackson写JSON 聊完,流式API的写局部能够认为你已齐全把握了,本文理解它读的局部。 版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE小贴士:截止到本文,本系列后面所有示例都只仅仅导入jackson-core而已,后续若要新增jar包我会额定阐明,否则雷同注释什么叫读JSON?就是把一个JSON 字符串 解析为对象or树模型嘛,因而也称作解析JSON串。Jackson底层流式API应用JsonParser来实现JSON字符串的解析。 最简应用Demo筹备一个POJO: @Datapublic class Person { private String name; private Integer age;}测试用例:把一个JSON字符串绑定(封装)进一个POJO对象里 @Testpublic void test1() throws IOException { String jsonStr = "{\"name\":\"YourBatman\",\"age\":18}"; Person person = new Person(); JsonFactory factory = new JsonFactory(); try (JsonParser jsonParser = factory.createParser(jsonStr)) { // 只有还没完结"}",就始终读 while (jsonParser.nextToken() != JsonToken.END_OBJECT) { String fieldname = jsonParser.getCurrentName(); if ("name".equals(fieldname)) { jsonParser.nextToken(); person.setName(jsonParser.getText()); } else if ("age".equals(fieldname)) { jsonParser.nextToken(); person.setAge(jsonParser.getIntValue()); } } System.out.println(person); }}运行程序,输入: ...

July 28, 2020 · 5 min · jiezi

关于jackson:3-懂了这些方敢在简历上说会用Jackson写JSON

你必须十分致力,能力看起来毫不费力。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位好,我是A哥(YourBatman)。上篇文章:2. 妈呀,Jackson原来是这样写JSON的 晓得了Jackson写JSON的姿态,切实感触了一把ObjectMapper原来是这样实现序列化的...本文持续深刻探讨JsonGenerator写JSON的细节。 先闲聊几句题外话哈。咱们在书写简历的时候,都会用肯定篇幅展现本人的技能点(亮点),就像这样:这一part十分重要,它决定了面试官是否有跟你聊的趣味,决定了你是否能在浩如烟海的简历中够怀才不遇。如何做到差异性?在当下如此发达的信息社会里,信息的获取唾手可得,所以在常识的广度方面,我认为人与人之间的差别其实并不大:你晓得DDD畛域驱动、读过架构整洁之道、晓得六边形架构、晓得DevOps......难道你还在想凭一些概念卖钱?拉出差距?你在用Spring技术栈、在用Redis、在用ElasticSearch......难道你还认为当初像10年前一样,会用就能加分? 一聊就会,一问就退,一写就废。这是很多公司程序员的真实写照,基/中层管理者尤甚。早早的和技术渐行渐远,导致裁员潮到来时很容易取得一张“飞机票”,年纪越大,焦虑感越强。 在你的公司是否有过这种场景:四五个人指挥一个人干活。对,就像这样:扎不扎心,老铁????。不过不必乐观,从这应该你看到的是机会,习xx都说了实干能力兴邦嘛,2019年裁员潮洗牌后,适者生存,不适者很多回老家了,这也让少量很有实力的程序员享受到了红利。应正了那句:当大潮褪去,才晓得谁在裸泳。 扯远了,言归正传。Jackson单会简略应用我认为还有余矣立足,那就跟我来吧~ 版本约定Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE注释一个框架/库好不好,不是看它的外围性能做得怎么样,而是非核心性能解决得如何。比方后盾页面做得咋样?容错机制呢?定制化、可配置化,扩展性等等。 Jackson称得上优良(甚至最佳)最次要是得益于它优良的module模块化设计,在接触其之前,咱们先实现本章节的内容:JsonGenerator写JSON的行为管制(配置)。 配置属于程序的一部分,它影响着程序执行的方方面面。Spring应用Environment/PropertySource治理配置,对应的在Jackson里会看到有很多Feature类来管制Jackson的读/写行为,均是应用enum枚举类型来治理。 上篇文章 咱们学会了如何应用JsonGenerator去写一个JSON,本文未来学习它的须要把握的应用细节。同样的,为围绕着JsonGenerator开展。 JsonGenerator的Feature它是JsonGenerator的一个外部枚举类,共10个枚举值: public enum Feature { // Low-level I/O AUTO_CLOSE_TARGET(true), AUTO_CLOSE_JSON_CONTENT(true), FLUSH_PASSED_TO_STREAM(true), // Quoting-related features @Deprecated QUOTE_FIELD_NAMES(true), @Deprecated QUOTE_NON_NUMERIC_NUMBERS(true), @Deprecated ESCAPE_NON_ASCII(false), @Deprecated WRITE_NUMBERS_AS_STRINGS(false), // Schema/Validity support features WRITE_BIGDECIMAL_AS_PLAIN(false), STRICT_DUPLICATE_DETECTION(false), IGNORE_UNKNOWN(false); ...}小贴士:枚举值均为bool类型,括号内为默认值这个Feature的每个枚举值都管制着JsonGenerator写JSON时的不同行为,并且可分为三大类(源码处我也有标注): Low-level I/O:底层I/O流相干。Jackson的流式API指的是I/O流,因而就波及到关流、flush刷新流等操作Quoting-related:双引号""援用相干。JSON标准规定key都必须有双引号,但这对于某些场景下并不需要Schema/Validity support:束缚/标准/校验相干。JSON作为K-V构造的数据,那么容许雷同key呈现吗?这便由这些特色去管制上面别离来意识意识它们。 AUTO_CLOSE_TARGET(true)含意即为字面意:主动敞开指标(流)。 true:调用JsonGenerator#close()便会主动敞开底层的I/O流,你无需再关怀false:底层I/O流请手动敞开主动敞开: @Testpublic void test1() throws IOException { JsonFactory factory = new JsonFactory(); try (JsonGenerator jg = factory.createGenerator(System.err, JsonEncoding.UTF8)) { // doSomething }}如果改为false:那么你就须要本人手动去close底层应用的OutputStream或者Writer。形如这样: ...

July 27, 2020 · 3 min · jiezi

关于jackson:2-妈呀Jackson原来是这样写JSON的

没有人永远18岁,但永远有人18岁。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位好,我是A哥(YourBatman)。上篇文章 整体介绍了世界上最好的JSON库 -- Jackson,对它有了整体理解:通晓了它是个生态,其它的仅是个JSON库而已。 有人说Jackson小众?那么请先看看上篇文章吧。学Jackson性价比特地高,因为它应用宽泛、会的人少,因而在团队内如果你能精通,附加价值的效应就会非常明显了...我挠头想了想,本系列来不了虚的,只能肝。本系列教程不仅仅传授根本应用,指标是搞完后可能解决日常99.99%的问题,毕竟每个小团队都最好能有某些方面的小专家,毕竟大家都不乏遇见过一个技术问题卡一天的状况。只有从底层把握,方能熟能生巧。 命名为core的模块个别都不简略,jackson-core天然也不例外。它是三大外围模块之一,并且是外围中的外围,提供了对JSON数据的残缺反对(包含各种读、写)。它是三者中最弱小的模块,具备最低的开销和最快的读/写操作。 此模块提供了最具底层的Streaming JSON解析器/生成器,这组流式API属于Low-Level API,具备十分显著的特点: 开销小,损耗小,性能极高因为是Low-Level API,所以灵便度极高又因为是Low-Level API,所以易错性高,可读性差jackson-core模块提供了两种解决JSON的形式(纵缆整个Jackson共三种): 流式API:读取并将JSON内容写入作为离散事件 -> JsonParser读取数据,而JsonGenerator负责写入数据树模型:JSON文件在内存里以树模式示意。此种形式也很灵便,它相似于XML的DOM解析,层层嵌套的作为“底层”技术,利用级开发中的确接触不多。为了引起你的器重,提前预报一下:Spring MVC对JSON音讯的转换器AbstractJackson2HttpMessageConverter它就用到了底层流式API -> JsonGenerator写数据。想不想拿下Spring呢?我想你的答案应该是Yes吧~ 置信做难事必有所得,你我他都会用的技术、都能解决的问题,那绝成不了你的外围竞争力,天然在团队内就难成发光体。 版本约定准则:均选以后最新版本(疏忽小版本) Jackson版本:2.11.0Spring Framework版本:5.2.6.RELEASESpring Boot版本:2.3.0.RELEASE 内置的Jackson和Spring版本均和????保持一致,防止了版本穿插阐明:相似2.11.0和2.11.x这种小版本号的差别,你权可认为没有区别工程构造鉴于是首次展现工程示例代码,将根本构造展现如下: 全副源码地址在本系列的最初一篇文章中会全副公示进去注释Jackson提供了一种对性能有极致要求的形式:流式API。它用于对性能有极致要求的场景,这个时候就能够应用此种形式来对JSON进行读写。 概念解释:流式、增量模式、JsonToken流式(Streaming):此概念和Java8中的Stream流是不同的。这里指的是IO流,因而具备最低的开销和最快的读/写操作(记得关流哦)增量模式(incremental mode):它示意每个局部一个一个地往上减少,相似于垒砖。应用此流式API读写JSON的形式应用的均是增量模式JsonToken:每一部分都是一个独立的Token(有不同类型的Token),最终被“拼凑”起来就是一个JSON。这是流式API里很重要的一个抽象概念。对于增量模式和Token概念,在Spirng的SpEL表达式中也有同样的概念,这在Spring相干专栏里你将会再次领会到本文将看看它是如何写JSON数据的,也就是JsonGenerator。 JsonGenerator应用DemoJsonGenerator定义用于编写JSON内容的公共API的基类(抽象类)。实例应用的工厂办法创立,也就是JsonFactory。 小贴士:纵观整个Jackson,它更多的是应用抽象类而非接口,这是它的一大“特色”。因而你相熟的面向接口编程,到这都要转变为面向抽象类编程喽。话不多说,先来一个Demo感触一把: @Testpublic void test1() throws IOException { JsonFactory factory = new JsonFactory(); // 本处只需演示,向控制台写(当然你能够向文件等任意中央写都是能够的) JsonGenerator jsonGenerator = factory.createGenerator(System.out, JsonEncoding.UTF8); try { jsonGenerator.writeStartObject(); //开始写,也就是这个符号 { jsonGenerator.writeStringField("name", "YourBatman"); jsonGenerator.writeNumberField("age", 18); jsonGenerator.writeEndObject(); //完结写,也就是这个符号 } } finally { jsonGenerator.close(); }}因为JsonGenerator实现了AutoCloseable接口,因而能够应用try-with-resources优雅敞开资源(这也是举荐的应用形式),代码革新如下: ...

July 24, 2020 · 3 min · jiezi

关于jackson:1-初识Jackson-世界上最好的JSON库

生命太短暂,不要去做一些基本没有人想要的货色。本文已被 https://www.yourbatman.cn 收录,外面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以收费学习。关注公众号【BAT的乌托邦】一一击破,深刻把握,回绝浅尝辄止。 前言各位小伙伴大家好,我是A哥。上篇文章 【Fastjson到了说再见的时候了】 A哥跟Fastjson说了拜拜,从本系列开始,咱们将一起进入Jackson库的学习。当然喽说它是世界上最好的JSON库并非一家之言,是官网上它本人说的,我免责申明哈。 一个工程仅需一个JSON库Java的JSON库,你至多应该用过/听过这三种:Jackson、Gson、Fastjson。一个独立的工程,依照依赖起码准则,本应该only one JSON库是足矣的。但现状是:各位同仁可察看察看各自的我的项目,大都同时存在2种JSON库,亦或者3种甚至更多... 阐明:在同一个工程内,同一性能若有多种实现,实属不好的景象。这会让治理起来显得凌乱(譬如对日期的格式化就不不便做到对立),进口若有多个,想收口时就是个大难题了作为一个合格的架构师/工程师,放弃最简依赖(一致性依赖)是应该有的技术范,因为简略一致性它能带来很大的收益,情理很简略:两个Java程序员的沟通/协同效率,肯定会比1个Java + 1个Python沟通效率高。 so what,咱们应该抉择哪一种JSON库呢?答案不言而喻,那便是Jackson。因为它各个方面体现均十分优良,是世界最风行、最好的JSON库。把Jackson作为工程惟一JSON库是有一丢丢门槛的(想想你为何应用Fastjson就晓得啦),所以它来啦,祝你逾越此门槛,规范化应用,助你减少一项支流的硬核实力,这也是本专栏的最大意义所在。 Jackson是世界最好的JSON库Jackson是一个简略的、功能强大的、基于Java的利用库。它能够很不便实现Java对象和Json对象(xml文档or其它格局)进行互转。Jackson社区绝对比拟沉闷,更新速度也比拟快。Jackson库有如下几大个性: 高性能且稳固:低内存占用,对大/小JSON串,大/小对象的解析体现均很优良风行度高:是很多风行框架的默认抉择容易应用:提供高层次的API,极大简化了日常应用案例无需本人手动创立映射:内置了绝大部分序列化时和Java类型的映射关系洁净的JSON:创立的JSON具备洁净、紧凑、体积小等特点无三方依赖:仅依赖于JDKSpring生态加持:jackson是Spring家族的默认JSON/XML解析器(明确了吧,学完此专栏你对Spring都能更亲热些了,两全其美)版本约定:本专栏对立应用的版本号固定为2.11.0(2020-04公布),GAV如下: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.11.1</version></dependency>为了放弃版本的统一性,后续的Spring Boot(2.3.0.RELEASE)/Spring Framework(5.2.6.RELEASE)应用的均为以后最新版本,因为它内置的jackson也恰好就是本专栏解说的版本。 注释仔细的敌人从下面的groupId里能够看到:jackson它隶属于fasterxml这个组织。本着寻根究底的精力,能够略微的理解理解这个组织:fasterxml官网 截图如下 简略翻译:FasterXML是Woodstox流的XML解析器、Jackson流的JSON解析器、Aalto非阻塞XML解析器以及一直增长的实用程序库和扩大家族背地的业务。 作为一个高度风行的开源库,这种官网页面应该刷新了你的认知吧。并不是它内容不多,而其实是它的具体介绍都公布在github上了,这便是接下来咱们来意识它的次要渠道。 这种做法貌似曾经成为了一种风行的趋势:越来越多的开源软件偏向于把github作为他们的Home Page了fasterxml组织它直属的一级工程其实也有不少: com.fasterxml.jacksoncom.fasterxml.uuidcom.fasterxml.woodstox...很显然,本专栏仅仅只会关注jackson工程,该工程便是该组织最闻名且最最最为重要的局部。 官网介绍理解一门新的技术,第一步应该就是看它的官网。下面未然解释了,fasterxml组织它把各工程的首页内容都托管在了github上,Jackson当然也不例外。Jackson官网 上对它本人有如下形容: Jackson旧称为:Java(或JVM平台)的规范JSON库,或者是Java的最佳JSON解析器,或者简称为“Java的JSON” 从这名字就霸气外露了,NB得不行,足以见得它在JSON解析方面的位置和风行水平,当然次要是自信 更重要的是,Jackson是一套JVM平台的 数据处理(不限于JSON) 工具集:包含 一流的 JSON解析器/ JSON生成器、数据绑定库(POJOs to and from JSON);并且提供了相干模块来反对 Avro, BSON, CBOR, CSV, Smile, Properties, Protobuf, XML or YAML等数据格式,甚至还反对大数据格式模块的设置。 分支:1.x和2.xJackson有两个次要的分支: 1.x分支,1.9.13。处于保护模式,只公布bug修复版本(最近一次公布于Jul, 2013)2.x是正在开发的版本(继续更新降级中,2.0.0公布于Mar, 2012)留神:这两个次要版本应用不同的Java包名和Maven GAV,因而它们并不互相兼容,但能够和平共存。一个我的项目能够同时依赖于这两个版本是没有抵触的。这是通过设计而为之,抉择这种策略是为了更顺利地从1.x进行迁徙2. x 阐明:当初都2020年了,1.x能够毫不客气的说曾经淘汰了(除了十分老的我的项目还在用),因而针对1.x版本本专栏不会有任何涉猎。沉闷的2.x分支阐明目前2.x分支存在如下沉闷的分支们: 2.12:下一个小版本,目前正在开发中2.11:以后稳定版。踊跃保护的分支,会踊跃继续公布补丁2.10:上一个稳固的分支,没有进行保护仍会公布补丁2.9: 非沉闷分支,只会公布微补丁了,尽管还沉闷但活跃度较低其它2.x分支:只会公布重大安全补丁master:主分支。下一个次要分支3.0正在疾速开发中阐明:对于2.11.0和2.11.x这种小分支之间的区别,能够疏忽模块介绍Jackson是个开源的、且凋谢的社区。上面列出的大多数我的项目/模块是由Jackson开发团队领导的,但也有一些来自Jackson社区的成员 三大外围模块core module(外围模块) 是扩大模块构建的根底。Jackson目前有3个外围模块: 阐明:外围模块的groupId均为:<groupId>com.fasterxml.jackson.core</groupId>,artifactId见上面各模块所示Streaming流解决模块(jackson-core):定义底层解决流的API:JsonPaser和JsonGenerator等,并蕴含特定于json的实现。Annotations规范注解模块(jackson-annotations):蕴含规范的Jackson注解Databind数据绑定模块(jackson-databind):在streaming包上实现数据绑定(和对象序列化)反对;它依赖于下面的两个模块,也是Jackson的高层API(如ObjectMapper)所在的模块理论利用级开发中,咱们只会应用到Databind数据绑定模块,so它是本系列重中之重。上面介绍那些无足轻重的第三方模块。 ...

July 23, 2020 · 1 min · jiezi