fasterxml jaskson的使用

news2024/11/17 11:45:11

fasterxml jaskson 的使用

  • 为啥要撰写这玩儿?
  • 解析json格式字符串
    • 判断是否是json格式字符串
    • 解析原理与解析函数
    • 如何使用该函数?

为啥要撰写这玩儿?

由于SpringBoot的依赖默认使用fasterxml-jaskson(可能是由于不想使用其他json处理包,也不知道为啥,即使其他jar包用法很简单,但是本着jar包的简洁性,还是想研究一下fasterxml-jaskson对json数据格式的创建和解析)。既然SpringBoot使用了这个jaskson依赖,一定也有它的道理。
后面发现,用这个玩意儿,可以不用创建POJO对象。这估计也是我想研究该类方法的一个原因吧。

解析json格式字符串

先上代码:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class TestMain {

    public static final ObjectMapper MAPPER = new ObjectMapper();
    public static void main(String[] args) {

		// 定义json字符串,格式中的“需要进行转意
        String jsonStr = "{\"username\":\"hello\", \"password\": \"world\"}";

        try {
        	// JsonParser 对象中有解析json格式的方法
        	// 该方法也可以用来验证 传入的字符串是否是json格式的字符串
        	// 如果不是json格式的字符串,则会抛出异常(毕竟要抛出异常)。
            JsonParser parser = MAPPER.createParser(jsonStr);
			// TODO ...编写解析方法
			// 该部分代码将会在后面添加
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}

maven库官网:https://mvnrepository.com/
fasterxml-json maven坐标:

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.13.4.2</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-core</artifactId>
	<version>2.13.4</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-annotations</artifactId>
	<version>2.13.4</version>
</dependency>

不要问我怎么知道需要这三个,因为这个:
请添加图片描述
推理呗!并且根据上面可以得到,jackson-databind.jar这个包是依赖jackson-annotations.jar 和 jackson-core.jar这两个包的!!

判断是否是json格式字符串

其中的代码片:

try {
 	JsonParser parser = MAPPER.createParser(jsonStr);
catch(IOException e){
 	throw new RuntimeException(e);
}

以上这段代码可以用来验证传入的字符串是否是json格式的字符串毕竟如果解析不正确,会抛出异常。

解析原理与解析函数

fasterxml-jackson是如何判断每个符号的呢?请看下面的截图:
请添加图片描述
嗯~,熟悉的味道。该枚举类定义了START_OBJECT、END_OBJECT等常量,就是用来判断传进来的字符串。但是目前没有搞懂NOT_AVAILABLE和VALUE_EMBEDDED_OBJECT具体怎么用,如果知道的博友,可以交流哈。

开始使用这个方法进行解析json字符串时,真的只是为了学习!没有其他的本意。但是,这个fasterxml-jackson包解析字符串确实比较麻烦。为此我专门研究了一个方法,给出代码:

public static void parse(JsonParser parser, JsonNode objectNode){
        try {


            ObjectNode objNode = null;
            ArrayNode arrNode = null;
            if(objectNode instanceof ObjectNode) {
                  objNode =(ObjectNode) objectNode;
            }else{
                arrNode = (ArrayNode) objectNode;
            }


            //只要是正规的json格式的字符串,则一定会有key
            String key = null;

            while(!parser.isClosed()) {
                JsonToken jsonToken = parser.nextToken();

                // 这里只过滤我们感兴趣的字段
                //
                switch (jsonToken){
                    case FIELD_NAME:
                        key = parser.getCurrentName();
                        break;
                    case VALUE_STRING:
                        String value = parser.getValueAsString();
                        objNode.put(key, value);
                        break;
                    case VALUE_NUMBER_FLOAT:
                        // 为了使得表示浮点数足够大,因此这里用getDoubleValue()来获取。
                        objNode.put(key, parser.getDoubleValue());
                        break;
                    case VALUE_NUMBER_INT:
                        objNode.put(key, parser.getIntValue());
                        break;
                    case VALUE_TRUE:
                    case VALUE_FALSE:
                        objNode.put(key, parser.getBooleanValue());
                        break;
                    case VALUE_NULL:
                        // put方法中没有可以负值null的接口,这里暂且用"null"代替。
                        objNode.put(key, "null");
                        break;

                    case START_OBJECT:
                        // 碰到值是对象的类型,则新建一个JsonNode类型的对象
                        JsonNode embededObj = MAPPER.createObjectNode();
                        if(objectNode instanceof ObjectNode) {
                            // springboot2.x.x的版本需要传个null,
                            // 即:"!objNode.isEmpty(null)"
                            if (!objNode.isEmpty()) {

                                objNode.set(key, embededObj);

                                // 递归调用处理,这里不能够和外层的else,中的parse()合并来写,因为,如果是处理根{},则不需要递归调用!
                                parse(parser, embededObj);
                            }
                        } else {
                            arrNode.add(embededObj);
                            // 递归调用处理
                            parse(parser, embededObj);
                        }


                        break;
                    case END_OBJECT:
                        // 如果对象解析结束则推出该层函数的解析
                        // 递归处理出口,直接返回return
                        return;
                    case START_ARRAY:
                        if(objectNode instanceof ObjectNode) {
                            // 当{}内部有[],就需要进入该判断。
                            if (!objectNode.isEmpty()) {
                                JsonNode arrayObj = MAPPER.createArrayNode();
                                objNode.set(key, arrayObj);
                                parse(parser, arrayObj);
//                            ((ObjectNode)objectNode).putArray(key);
                            }
                        }else{
                            // 如果根是[],并且是第一次进入该代码段,即objectNode是空的,则跳过。
                            if(!objectNode.isEmpty()) {
                                JsonNode arrObj = MAPPER.createArrayNode();
                                arrNode.add(arrObj);
                                // 递归调用处理,如果[]内部有{}则交给递归处理。
                                parse(parser, arrObj);
                            }
                        }
                        break;
                    case END_ARRAY:
                        // 如果数组解析结束则推出该层函数的解析
                        // 递归处理出口,直接返回return
                        return;

                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

以上代码是一个递归调用的代码,如果有余力,看看改成栈的形式,那是极好的。

如何使用该函数?

MAPPER.createParser()方法提供了多种解析的入口,大家可以自行选用。

public static void main(String[] args) {

        String jsonStr = "{\"username\":\"hello\", \"password\": \"world\", \"isNull\": null, \"embededObj\": {\"prop1\":\"value1\", \"prop2\": \"value2\"}, \"arrayObj\": [{\"objK1\": \"val1\"},{\"objK2\": \"val2\"}]}";

        try {

            JsonParser parser = MAPPER.createParser(jsonStr);

            // 可以从文件中解析,MAPPER.createParser(xxx)支持多种解析的入口。
            // JsonParser parser = MAPPER.createParser(new File("xxxx.json"));

            // 如果根是{} 则用MAPPER.createObjectNode()
            ObjectNode objectNode = MAPPER.createObjectNode();

            // 如果根是[] 则用MAPPER.createArrayNode()
            ArrayNode arrayNode = MAPPER.createArrayNode();


            parse(parser, objectNode);
            parse(parser, arrayNode);
            
            System.out.println(objectNode);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

以上就是对fasterxml-jackson使用的初步探索,大家有其他的想法可以多多交流哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django疫苗及注射管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

员工账号管理,超市便利店烟酒茶叶服装门店零售手机收银软件APP

https://www.bilibili.com/video/BV1v841157e4/?vd_sourcebe5b336e3cce67dfc9122f3eaf7119ad我们的门店零售手机收银A P P&#xff0c;不限制用户数&#xff0c;也就是有多少零售收银员工&#xff0c;都可以给他们分配账号&#xff0c;并下载A P P登录使用。, 视频播放量 1、弹…

计算两个颜色相似度

1.计算两个颜色相似度的公式如下: 颜色QColor1(R1, G1, B1)转成h1,s1,v1 颜色QColor2(R2, G2, B2)转成h2,s2,v2 detah=h1-h2 detas=s1-s2 detav=v1-v2 len = qsrt(detah * detah + detas * detas + detav * detav) if (len > 1) len = 1.0 similarity = (1.0 - le…

frp内网穿透(Mac远程连接公司windows)

文章目录1、需求&#xff1a;自己的电脑远程访问公司的windos电脑2、搭建内网穿透&#xff1a;准备工具3、安装运行3.1 服务端配置3.2 客户端配置4、远程连接1、需求&#xff1a;自己的电脑远程访问公司的windos电脑 自己电脑Mac连公司windows&#xff1a;通过Microsoft Remote…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK10特性讲解】

JDK各个版本特性讲解-JDK10特性 lecture&#xff1a;波哥 一、JAVA10概述 2018年3月21日, Oracle官方宣布JAVA10正式发布 JAVA9和java10 都不是 LTS (Long-Term-Support)版本.和过去的JAVA大版本升级不同,这两个只有半年左右的开发和维护时间. 而JAVA11 也是就是18.9,才是JAVA之…

Cyanine5.5 Tyramide,Cy5.5 Tyramide,花青素Cy5.5 酪酰胺菁染料供应

试剂英文名称&#xff1a;Cyanine5.5 Tyramide&#xff0c;Cy5.5 Tyramide 试剂中文名称&#xff1a;花青素Cy5.5 酪酰胺 Item no&#xff1a;Y-R-3588 Formula&#xff1a;C48H52CIN3O2 MW&#xff1a;738.4 Purity&#xff1a;95% Storage&#xff1a;-20℃可长期保存&…

arthas在线监控和debug

文章目录一. arthas-tunnel-server1.1 制作镜像1.2 k8s部署arthas-tunnel-server1.3 docker-compose部署1.4 Redis缓存二. 源码本地启动2.1 启动后端2.2. 启动前端2.3 启动客户端官方文档 https://arthas.aliyun.com/doc/tunnel.html一. arthas-tunnel-server 1.1 制作镜像 D…

3年以上Android开发者,关于学习 Compose,我的经验总结和建议

缘起 又到一年快结束的日子了 这一年里经历了裁员&#xff0c;跳槽&#xff0c;跑路&#xff0c;也当过面试官面试一些同学。 经历过攻守的角色转换后&#xff0c;沉下心&#xff0c;回顾过往&#xff0c;不由得发出感叹&#xff0c;今年卷的不行。 无论是裁员还是跳槽&…

10 个你应该知道的强大的JavaScript代码片段

JavaScript 现在非常流行&#xff0c;尤其是在 Web 开发中。随着新的 ECMAScript 版本&#xff0c;JavaScript 语法有了很大的改进。因此&#xff0c;JavaScript语言现在具有许多强大且有趣的功能&#xff0c;我们可以作为开发人员在代码中使用它们。 另一件好事是&#xff0c…

跨域解决方法

1.JSONP 前端通过script标签的src属性将回调函数传给服务器&#xff0c;服务器拿到回调函数后&#xff0c;会将数据作为回调函数的参数并将该回调函数返回&#xff0c;前端这边拿到回调函数执行&#xff0c;就可以获取服务端的数据 非直接方式获取数据 并且只支持get&#xf…

PostgreSQL数据库存储结构

PostgreSQL数据库集簇是——多个数据库的集合。 初始化库集簇&#xff1a;INITDB –D $PGDATA来完成。&#xff08;相当于oracle数据库dbca建库&#xff09; pg_ctl -d $PGDATA可以启动数据库 对象标识符&#xff08;OID&#xff09;来对整个数据集簇中唯一的标识数据库对象&a…

一个支持 CRUD 快速开发的 Web 框架,用着太爽

RUD 可谓是程序员又爱又恨的操作了。 爱&#xff0c;大部分的业务基本上都是增删改查的变种&#xff0c;基于增删改查可以实现大部分的业务。 恨&#xff0c;是因为普通的增删改查页面开发占据了大量的时间&#xff0c;非常无聊&#xff0c;同时又不会有技术上的提升。 如何能…

week14|week15 查阅文章总结

带宽的概念 信道容量 参数估计 朴素贝叶斯 数学建模 关联规则 聚类 github http 奈氏准则和香农定理 计算机控制 带宽的概念:带宽的两种概念__Charles_Chen的博客-CSDN博客_带宽的两种含义 信道容量:

【计算机视觉】关键考点

计算机标定 计算机标定的流程&#xff1f; 1.求解内参矩阵和外参矩阵的积H 当一张图片上的标定板角点数量等于4时&#xff0c;即可求得该图片对应的矩阵H 。当一张图片上的标定板角点数量大于4时&#xff0c;利用最小二乘法回归最佳的矩阵H 。 最小二乘法:简单地说就是通过n…

浅谈JVM及原理

JVM一直是java知识里面进阶阶段的重要部分&#xff0c;如果希望在java领域研究的更深入&#xff0c;则JVM则是如论如何也避开不了的话题&#xff0c;本系列试图通过简洁易读的方式&#xff0c;讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是&#xff1a;一次编…

【SSM项目案例】数据库增删改查-完整代码

一、搭建环境 1&#xff09;spring环境搭建 2&#xff09;spring整合springmvc框架 目的&#xff1a;在controller中能成功调用service对象的方法 在项目启动时&#xff0c;加载applicationContext.xml的配置文件&#xff0c;在web.xml中进行配置 在controller中注入servic…

星巴克激战瑞幸:“咖啡老三们”的危险时刻

老大和老二“打架”&#xff0c;老三却“伤”得不轻。 在国内品牌界&#xff0c;经常出现这种颇有意思的商业现象。凉茶界里的加多宝和王老吉相互厮杀&#xff0c;排在后面的和其正声势渐弱。可口可乐和百事可乐不断较量&#xff0c;结果非常可乐消失了。 眼下在国内的咖啡圈…

这可能是全网最详细的python安装教程(windows)

python安装是学习pyhon第一步&#xff0c;很多刚入门小白不清楚如何安装python&#xff0c;今天我来带大家完成python安装与配置&#xff0c;跟着我一步步来&#xff0c;很简单&#xff0c;你肯定能完成。 第一部分&#xff1a;python安装 &#xff08;一&#xff09;准备工作…

CocosCreator3.4.2源码渲染流程解读

首先上一张脑图镇楼&#xff0c;有些流程还有待后续补充&#xff0c;但是整个刷新过程差不多都完成了。 在上一个xmind文件地址https://download.csdn.net/download/m0_37609239/87254684 接下来就正式开始讲代码&#xff1a; 每帧刷新渲染还是从mainloop开始讲&#xff0c;前面…

华为机试 - 对称美学

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 对称就是最大的美学&#xff0c;现有一道关于对称字符串的美学。已知&#xff1a; 第1个字符串&#xff1a;R第2个字符串&#xff1a;BR第3个字符串&#xff1a;RBBR第4个字符串&#xff1a;BRRBRBBR…