jackson 用流的形式解析json

Jackson解析JSON详细教程 Jackson和FastJson一样,是一个Java语言编写的,可以进行JSON处理的开源工具库,Jackson的使用非常广泛,Spring框架默认使用Jackson进行JSON处理Jackson有三个核心包,分别是,通过这些包可以方便的对JSON进行操作在模块。定义了一些流处理相关的API以及特定的JSON实现在模块,包含了Jackson中的注解在模块,在Streaming包的基础上实现了数据绑定,依赖于Streaming和包得益于Jackson高扩展性的设计,有很多常见的文本格式以及工具都有对。.... 阅读详情

工作中有个需求,就是用流的形式解析json文档。 我们采用了jackson框架来处理json文件。

业务逻辑里有个特殊的需求,就是当解析到一个FIELD_NAME时,要得到他的完整名字(嵌套在很多层里)   而且还要知道这个FILED_NAME的类型,是object还是array还是基本类型等等。    但是用流解析时,parser过去之后就回不来了,而当我的parser在FIELD_NAME时,我需要知道parser的下一项是什么,而且我有要parser停留在FILED_NAME上,这样的话一个parser是做不到了    于是我用了两个parser,相当于两个指针,一前一后的遍历json文件。  

可能表述的不是很清楚,还是直接看看代码吧

package com.nothing.jackson;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class Better {
	@SuppressWarnings("boxing")
	public static void main(String[] args) throws IOException, Exception {
		JsonFactory f = new JsonFactory();
		JsonParser p = f.createJsonParser(new File("c:/countries222.json"));
		JsonParser q = f.createJsonParser(new File("c:/countries222.json"));
		final String TOP_ARRAY = "[TopArray]";
		final String TOP_OBJECT = "TopObj";
		List<String> fatherList = new ArrayList<String>();
		List<String> nameList = new ArrayList<String>();
		Map<String, Integer> map = new HashMap<String, Integer>();
		q.nextToken();// q is the next token of p

		while (p.nextToken() != null) {
			q.nextToken();
			// System.out.println("p--->" + p.getCurrentToken());
			// System.out.println("q--->" + q.getCurrentToken());
			if (p.getCurrentToken() == JsonToken.START_OBJECT) {
				if (p.getCurrentName() != null) {// 非数组中的obj
					fatherList.add(p.getCurrentName());
				} else if (p.getCurrentName() == null ) {// 数组中的obj或者TopObj
					if(fatherList.size()==0){//TopObj
						fatherList.add(TOP_OBJECT);
					}else if (fatherList.size()!=0){//数组中的Obj
						String father = StringUtils.join(fatherList, '.');
						map.put(father, map.get(father)+1);
					}
				}
			}

			if (p.getCurrentToken() == JsonToken.END_OBJECT) {
				if (!"".equals(fatherList) && p.getCurrentName() != null) fatherList.remove(fatherList.size() - 1);
			}
			if (p.getCurrentToken() == JsonToken.START_ARRAY) {
				if (p.getCurrentName() != null) {
					fatherList.add("[" + p.getCurrentName() + "]");
					String father = StringUtils.join(fatherList, ".");
					map.put(father, 0);
				} else if (p.getCurrentName() == null) {//即这个array是topArray
					fatherList.add(TOP_ARRAY);
					String father = StringUtils.join(fatherList, '.');
					map.put(father, 0);
				}
			}

			if (p.getCurrentToken() == JsonToken.END_ARRAY) {
				String father = StringUtils.join(fatherList, ".");
				if (fatherList.size() == 0) {
					father = TOP_ARRAY;
				}
				System.out.println(father + " size : \t" + map.get(father));
				fatherList.remove("[" + p.getCurrentName() + "]");
			}

			if (p.getCurrentToken() == JsonToken.FIELD_NAME) {
				if (q.getCurrentToken() == JsonToken.START_ARRAY) {
					// 如果p指向的是个数组,名字为father+[text]
					nameList.addAll(fatherList);
					nameList.add("[" + p.getText() + "]");
					String name = StringUtils.join(nameList, '.');
					System.out.println("Enconter: \t" + p.getText());
					System.out.println("propertyName: \t" + name);
					System.out.println("Type: \t\t" + q.getCurrentToken());// 当p指向的是FIELD_NAME时,要用q来获得类型
					nameList.removeAll(nameList);
					System.out.println("--------------------------------------");
				} else if (p.getCurrentToken() == JsonToken.FIELD_NAME
						&& (q.getCurrentToken() == JsonToken.START_OBJECT || Pattern.matches("VALUE_\\w+", q.getCurrentToken().toString()))) {
					// 如果p指向的不是数组,名字为 father+text
					nameList.addAll(fatherList);
					nameList.add(p.getText());
					String name = StringUtils.join(nameList, '.');
					System.out.println("Enconter: \t" + p.getText());
					System.out.println("propertyName: \t" + name);
					System.out.println("Type: \t\t" + q.getCurrentToken());// 当p指向的是FIELD_NAME时,要用q来获得类型
					nameList.removeAll(nameList);
					System.out.println("--------------------------------------");
				}
			}

			if (Pattern.matches("VALUE_\\w+", p.getCurrentToken().toString())) {
				if (p.getCurrentName() != null) {// 非数组中的value
					nameList.addAll(fatherList);
					nameList.add(p.getCurrentName());
					String name = StringUtils.join(nameList, '.');
					System.out.println("Enconter: \t" + p.getText());
					System.out.println("propertyName: \t" + name);
					nameList.removeAll(nameList);
					System.out.println("Type: \t\t" + p.getCurrentToken());// 当p指向VALUE_*时,通过p自己可以获得类型
					System.out.println("--------------------------------------");
				} else if (p.getCurrentName() == null) {// 数组中的value
					String father = StringUtils.join(fatherList, '.');
					if (fatherList.size() == 0) {
						father = TOP_ARRAY;
					}
					System.out.println("Enconter: \t" + p.getText());
					System.out.println("propertyName: \t" + father);
					map.put(father, map.get(father) + 1);
					System.out.println("Type: \t\t" + p.getCurrentToken());
					System.out.println("--------------------------------------");
				}
			}
		}

		p.close();
	}
}

c:/coutries222.json文档如下:

{
    "国家": {
        "中国": {
            "省份": [
                {
                    "名称": "浙江",
                    "城市": [
                        "杭州",
                        "宁波"
                    ]
                },
                {
                    "名称": "江苏",
                    "城市": [
                        "苏州",
                        "南京",
						"无锡",
						"徐州"
                    ]
                }
            ],
			"area" : 9600
        },
        "其他国家": [
            "英国",
            "德国",
            "日本"
        ]
    }
}

输出结果如下:


Enconter: 	国家
propertyName: 	TopObj.国家
Type: 		START_OBJECT
--------------------------------------
Enconter: 	中国
propertyName: 	TopObj.国家.中国
Type: 		START_OBJECT
--------------------------------------
Enconter: 	省份
propertyName: 	TopObj.国家.中国.[省份]
Type: 		START_ARRAY
--------------------------------------
Enconter: 	名称
propertyName: 	TopObj.国家.中国.[省份].名称
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	浙江
propertyName: 	TopObj.国家.中国.[省份].名称
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	城市
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		START_ARRAY
--------------------------------------
Enconter: 	杭州
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	宁波
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
TopObj.国家.中国.[省份].[城市] size : 	2
Enconter: 	名称
propertyName: 	TopObj.国家.中国.[省份].名称
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	江苏
propertyName: 	TopObj.国家.中国.[省份].名称
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	城市
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		START_ARRAY
--------------------------------------
Enconter: 	苏州
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	南京
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	无锡
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	徐州
propertyName: 	TopObj.国家.中国.[省份].[城市]
Type: 		VALUE_STRING
--------------------------------------
TopObj.国家.中国.[省份].[城市] size : 	4
TopObj.国家.中国.[省份] size : 	2
Enconter: 	area
propertyName: 	TopObj.国家.中国.area
Type: 		VALUE_NUMBER_INT
--------------------------------------
Enconter: 	9600
propertyName: 	TopObj.国家.中国.area
Type: 		VALUE_NUMBER_INT
--------------------------------------
Enconter: 	其他国家
propertyName: 	TopObj.国家.[其他国家]
Type: 		START_ARRAY
--------------------------------------
Enconter: 	英国
propertyName: 	TopObj.国家.[其他国家]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	德国
propertyName: 	TopObj.国家.[其他国家]
Type: 		VALUE_STRING
--------------------------------------
Enconter: 	日本
propertyName: 	TopObj.国家.[其他国家]
Type: 		VALUE_STRING
--------------------------------------
TopObj.国家.[其他国家] size : 	3


Jackson 解析 JSON 详细教程 JSON 对于开发者并不陌生,如今的 WEB 服务、移动应用、甚至物联网大多都是以 JSON 作为数据交换的格式。学习 JSON 格式的操作工具对开发者来说是必不可少的。这篇文章将介绍如何使用 Jackson 开源工具库对 JSON 进行常见操作。什么是 JSON ?JSON 是 ”JavaScript Object Notation“ 的缩写,JSON 是一种基于文本的格式,可以把它理解为是一个结构化的数据,这个结构化数据中可以包含键值映射、嵌套对象以及数组等信息。 Jackson 介绍 Jacks 阅读详情

相关推荐

STM32移植LVGL(LittleVGL)

**STM32移植LVGL(LittleVGL)**

qq_53000374的博客 1万+

关于使用 Jackson 解析 JSON 你需要知道的一切

今天的大多数网络都以JSON格式交换数据。Web服务器、Web和移动应用程序,甚至物联网设备都使用JSON相互通信。因此,一种简单灵活的处理JSON的方式对于任何软件在当今世界的生存都是必不可少的。...

qq_43430343的博客 1638

芯片设计中的复位艺术——从异步复位同步释放到复位树构建

本文深入探讨了芯片设计中复位策略的核心技术与工程实践。重点解析了异步复位同步释放这一黄金方案的原理与优势,它通过复位同步器解决了异步复位释放时的时序风险。文章进一步阐述了如何构建稳健的复位树以应对大规模SoC设计,并分析了多时钟域与低功耗场景下的复位设计挑战,为提升芯片可靠性提供了系统性的方法论。

neovim7hacker的博客 487

Java流式解析json_解析Java的Jackson库中Streaming API的使用

解析Java的Jackson库中Streaming API的使用发布于 2020-3-28|复制链接摘记: 流式API读取和写入JSON内容离散事件。 JsonParser读取数据,而JsonGenerator写入数据。它是三者中最有效的方法,是最低开销和最快的读/写操作。它类似于XML的Stax解析器。在本文中,我们将展示的使用Jackson的流式API 读写JSON数据。流式API工作使用JS...

weixin_39712865的博客 476

瑞芯微RK3588开发板VSCode远程开发全攻略:从SSH配置到插件优化

本文详细介绍了如何在瑞芯微RK3588开发板上配置VSCode远程开发环境。从Ubuntu系统下的SSH服务设置、VSCode Remote-SSH扩展安装,到连接建立、基础工具链部署,再到针对ARM平台的性能优化与调试配置,提供了一套完整的实战指南,帮助开发者高效利用本地资源进行嵌入式开发。

weixin_28831341的博客 623

使用ADS进行LNA低噪放设计的详细教程

详细介绍了通过ADS软件进行LNA设计的过程,从晶体管的选型到稳定性系数分析、再到输入输出端匹配,完整的讲解了低噪放的设计流程,可以使新手小白以及学习射频放大器的朋友可以快速的了解掌握ADS的使用方法和LNA的设计方法。

weixin_41831333的博客 3450

使用流式处理解析大型 JSON 数据

使用流式处理解析大型 JSON 数据--微信公众平台 (qq.com)

qq920764029的博客 852

基于Canfestival的对象字典工具objdictedit.py的运行环境配置

本文以菜狗的视角,一步一步地对对象字典的环境进行配置,旨在能给读者一个比较详细的参考,不恰之处,还请指正。

在线求职中... 3709

深入探索Java:揭秘流式解析JSON的神秘面纱

在当今数据驱动的时代,处理JSON数据已成为日常开发中不可或缺的一部分。对于Java开发者来说,能够高效、灵活地解析JSON数据是至关重要的技能。本篇文章将带你深入了解如何使用Java进行JSON解析,特别是通过JsonReader进行流式解析,以及如何优雅地处理嵌套多层的JSON结构。JsonReader是Java标准库中提供的一个用于流式解析JSON的类。它提供了一种迭代器风格的接口,允许你逐个读取JSON中的字段和值。使用JsonReader。

木头大左的博客 1859

Altium AD20的PCB板框绘制、定义板子形状、重新设置原点、放置尺寸标注

AD20的板框绘制与以前的版本不同,以前板框是在KeepOut层,而在AD20中没有这个层,绘制板框需要到机械层Mechanical1。 板框大小评估 首先进行板框大小评估。 工具 - 器件摆放 - 在矩形区域摆放。 之后通过鼠标框选矩形区域,元件会自动按照框选的范围进行摆放。这个操作可以重复多次,最后大致得出需要的板框尺寸。确定好后右键。 板框绘制,重新定义板子形状 点击下方的 Mechanical1,切换到机械层。放置线条,根据元件摆放来绘制PCB大致的形状,将元件完全包裹。

Mark_md的博客 10万+

Solidworks钣金设计:折弯系数、K因子与折弯扣除的实战应用解析

本文深入解析Solidworks钣金设计中折弯系数、K因子与折弯扣除的核心概念与实战应用。通过厘清三者间的逻辑关系与换算方法,并结合材料特性、工艺参数及车间实测,指导工程师精准确定展开长度,确保设计图纸与加工实物的一致性,有效提升钣金件设计精度与生产效率。

weixin_29268267的博客 924

使用Jackson解析海量的Json数据

在Java中解析海量的JSON数据是一个需要仔细考虑内存管理和性能优化的任务。以下是一些基本策略和代码示例,展示了如何使用Jackson或Gson等库高效地解析大量JSON数据。

jackiendsc的博客 1155

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案

本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。

weixin_29232507的博客 1639

Jackson解析Json数据

Jackson和 FastJson 一样,是一个 Java 语言编写的,可以进行 JSON 处理的开源工具库,Jackson 的使用非常广泛,Spring 框架默认使用 Jackson 进行 JSON 处理。Jackson 有三个核包,分别是,通过这些包可以方便的对 JSON 进行操作。Streaming在模块。定义了一些流处理相关的 API 以及特定的 JSON 实现。在模块,包含了 Jackson 中的注解。Databind在模块, 在Streaming包的基础上实现了数据绑定,依赖于。

weixin_44852067的博客 2762

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

2. 妈呀,Jackson原来是这样写JSON的

底层原理,jackson-core核心模块JsonGenerator流式API高效写JSON

架构师:通透,才能写出好代码! 3371

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Springboot Jackson 解析 JSON 详细教程

什么是JSON?JSON是”“的缩写,JSON是一种基于文本的格式,可以把它理解为是一个结构化的数据,这个结构化数据中可以包含键值映射、嵌套对象以及数组等信息。{"array"[1,2,3],"boolean"true,"color""gold","null"null,"number"123,"object"{"a""b","c""d"},"string"}Jackson默认使用Jackson进行JSON处理。•Streaming[1]在。.........

LoveSummer 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用jackson解析json数据详讲

Java操作json数据 json 简介 概念   JSON:JavaScript Object Notations,即javaScript的对象表示法,是javaScript语法的一个子集,相当于javaScript中的一个对象。虽然json起源于javaScript,但是很多语言都支持json数据格式的解析与生成,是一种文本数据格式,官方的MIME类型是:application/json。    应用场景 常用在使用javaScript,java,node.js

weixin_44184990的博客 3652

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

Json解析工具类前言一、各个JSON技术的简介1.1 FastJson角色1.2 Jackson角色1.3 Gson角色二、使用步骤2.1 引入库1、FastJson依赖2、Jackson依赖3、Gson依赖2.2 将JSON 字符串转换为Java 对象1、FastJson版本2、Jackson版本3、Gson版本2.3 将Java对象转换为JSON 字符串1、FastJson版本2、Jackson版本3、Gson版本2.4 将JSON 字符串数组转为JSON数组1、FastJson版本2、Jackson

日常分享工作中的一些技术干货。 5714

java中JSON的使用(4种解析方式,满满干货)

又到了周末整理季,其实这周学了很多东西,但是还未动手实践,所以就拿部分学到的进行整理。话不多说,上第一个知识点:JSON。 什么是JSON? 肯定很多人都会心里回答,一种数据交换格式,没毛病,JSON就是一种轻量级的数据交换格式,与开发语言无关。 JSON的数据结构呢? 对象(object):一个对象包含一系列非排序的键/值对,一个对象以 {开始,并以 }结束。每个键/值对之间使用 :分区。多个键值对之间通过 , 分割。需要注意的是JSON 的键是一个 String 类型的字符串。 JSON 值的格式呢?

qq_43386941的博客 5万+

JSON以及Jackson操作

一、JSON 1、简介 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法。类似 XML JSON 比 XML 更小、更快,更易解析。 JSON可以被各种语言使用 2、语法 2.1、json主要通过键值对保存数据 2.2、内容可以是对象、数组等 3、实例 <script> //数组...

cgl_dong的博客 1219

Android-JSON解析(Gson、org.json、Jackson、FastJson)

谨以文章记录学习历程,如有错误还请指明。 JSON简介 定义: 一种 轻量级的文本数据 交换格式 作用: 数据标记、存储 &amp; 传输 简记用法: {} 表示对象;[] 表示数组; “” 表示属性或值; :冒号表示后者是前者的值,这个值可以是对象、数组、字符串、数字等 特点: 轻量级 良好的可读性 &amp; 快读编写 独立于平台 解析方式 类似XML解析,分两...

whdAlive 's blog 1311

我的天,Jackson原来是这样写JSON的

文章很长,文末有福利 前言 各位好,我是A哥(YourBatman)。上篇文章整体介绍了世界上最好的JSON库 -- Jackson,对它有了整体了解:知晓了它是个生态,其它的仅是个JSON库而已。 有人说Jackson小众?那么请先看看上篇文章吧。学Jackson性价比特别高,因为它使用广泛、会的人少,因此在团队内如果你能精通,附加价值的效应就会非常明显了... 我挠头想了想,本系列来不了虚的,只能肝。本系列教程不仅仅教授基本使用,目标是搞完后能够解决日常99.99%的问题,毕竟每个小团队..

qq16680473763的博客 593

jackson解析json详细教程

什么是JSON?JSON 是 ”“ 的缩写,JSON 是一种基于文本的格式,可以把它理解为是一个结构化的数据,这个结构化数据中可以包含键值映射、嵌套对象以及数组等信息。{1,2,3],"a": "b","c": "d"},}Jackson和 FastJson 一样,是一个 Java 语言编写的,可以进行 JSON 处理的开源工具库,Jackson 的使用非常广泛,Spring 框架默认使用 Jackson 进行 JSON 处理。Jackson 有三个核包,分别是。

java技术博客 776

Jackson-你可能错过的最好用Json工具

jackson是一个简单且功能强大的基于java的应用库,它可以便捷的完成Java对象和Json对象的转换。高性能且稳定:Jackson低内存占用,对Json和对象的解析都很优秀流行度高:Jackson的社区活跃,有很多程序员在使用,同时Jackson是Spring中默认的JSON/XML解析器便于使用:在Jackso中提供大量的注解,例如我们常用的时间格式化注解@JsonFormat干净的json:创建JSON时干净、紧凑、体积小等特点。

jiashn123的专栏 1611
上一篇: Java序列化机制
下一篇: enum实现单例模式与一般单例模式的比较
nothing0318
博客等级 码龄16年 11粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值