Jackson - JsonGenerator创建JSON、JsonParser解析JSON
以下是关于如何使用Jackson的JsonGenerator
类来创建JSON内容以及如何使用JsonParser
类来读取JSON内容的教程。
依赖项
首先,在pom.xml
文件中添加以下依赖项以引入Jackson库:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version>
</dependency>
这将自动引入以下库到您的项目中:
jackson-annotations-2.9.8.jar
jackson-core-2.9.8.jar
jackson-databind-2.9.8.jar
始终建议使用Maven中央仓库中的最新版本。
使用JsonGenerator
写入JSON内容
步骤:
- 创建
JsonFactory
实例。 - 使用
JsonFactory
创建JsonGenerator
。 - 使用
JsonGenerator
的方法构建JSON结构。 - 关闭
JsonGenerator
。
示例代码:
package net.javaguides.jackson;import java.io.File;
import java.io.IOException;import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;/*** 使用JsonGenerator写入JSON到文件* @author Ramesh Fadatare*/
public class WriteJsonUsingJsonGenerator {public static void main(String[] args) throws IOException {JsonFactory factory = new JsonFactory();// 创建JsonGeneratorJsonGenerator generator = factory.createGenerator(new File("post.json"), JsonEncoding.UTF8);// 开始JSON对象generator.writeStartObject(); // 开始 { // 添加字符串字段generator.writeNumberField("id", 100);generator.writeStringField("title", "Jackson JSON API Guide");generator.writeStringField("description", "Post about Jackson JSON API");generator.writeStringField("content", "HTML content here");// 创建数组generator.writeFieldName("tags");generator.writeStartArray(); // 开始 [// 第一个标签对象generator.writeStartObject();generator.writeNumberField("id", 1);generator.writeStringField("name", "JSON");generator.writeEndObject();// 第二个标签对象generator.writeStartObject();generator.writeNumberField("id", 2);generator.writeStringField("name", "Java");generator.writeEndObject();// 第三个标签对象generator.writeStartObject();generator.writeNumberField("id", 3);generator.writeStringField("name", "Jackson");generator.writeEndObject();generator.writeEndArray(); // 结束 ]generator.writeEndObject(); // 结束 }// 关闭JSON生成器generator.close();}
}
运行上述程序后,会在post.json
文件中写入如下JSON内容:
{"id" : 100,"title" : "Jackson JSON API Guide","description" : "Post about Jackson JSON API","content" : "HTML content here","tags" : [ { "id" : 1, "name" : "JSON" }, { "id" : 2, "name" : "Java" }, { "id" : 3, "name" : "Jackson" } ]
}
使用JsonParser
读取JSON内容
在本例中,我们将从外部文件post.json
(在之前的例子中我们已经写入了JSON内容)读取JSON内容。
步骤:
- 创建
JsonParser
使用JsonFactory.createJsonParser()
方法。 - 使用
nextToken()
方法遍历每个JSON字符串作为token。 - 检查每个token并相应处理。
示例代码:
package net.javaguides.jackson;import java.io.File;
import java.io.IOException;import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;/*** 使用JsonParser从文件读取JSON* @author Ramesh Fadatare*/
public class ReadJsonUsingJsonParser {public static void main(String[] args) throws IOException {JsonFactory factory = new JsonFactory();// 创建File对象File file = new File("post.json");// 创建JsonParserJsonParser parser = factory.createParser(file);// 读取第一个对象即 {JsonToken token = parser.nextToken();// 读取JSON对象while (parser.nextToken() != null) {if (token == JsonToken.FIELD_NAME) {String fieldName = parser.getCurrentName();token = parser.nextToken(); // 移动到值switch (fieldName) {case "id":System.out.println("ID: " + parser.getIntValue());break;case "title":System.out.println("Title: " + parser.getText());break;case "description":System.out.println("Description: " + parser.getText());break;case "content":System.out.println("Content: " + parser.getText());break;case "tags":System.out.println("Tags are - ");while (parser.nextToken() != JsonToken.END_ARRAY) { // 遍历数组直到 ]if (parser.getCurrentToken() == JsonToken.START_OBJECT) {while (parser.nextToken() != JsonToken.END_OBJECT) {if ("id".equals(parser.getCurrentName())) {parser.nextToken();System.out.print("ID: " + parser.getIntValue() + ", ");} else if ("name".equals(parser.getCurrentName())) {parser.nextToken();System.out.println("Name: " + parser.getText());}}}}break;}}}parser.close();}
}
输出:
ID: 100
Title: Jackson JSON API Guide
Description: Post about Jackson JSON API
Content: HTML content here
Tags are -
ID: 1, Name: JSON
ID: 2, Name: Java
ID: 3, Name: Jackson
总结
以上代码展示了如何使用JsonGenerator
创建复杂的JSON结构,并且使用JsonParser
解析这些结构。
通过这种方式,您可以灵活地生成和解析JSON数据,这对于与Web服务交互或处理配置文件非常有用。
相关文章:
Jackson - JsonGenerator创建JSON、JsonParser解析JSON
以下是关于如何使用Jackson的JsonGenerator类来创建JSON内容以及如何使用JsonParser类来读取JSON内容的教程。 依赖项 首先,在pom.xml文件中添加以下依赖项以引入Jackson库: <dependency><groupId>com.fasterxml.jackson.core</groupI…...

Linux-音频应用编程
ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程,音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升,但是笔者仅向大家介绍 Li…...
《QT 示例宝库:探索丰富的编程世界》
《QT 示例宝库:探索丰富的编程世界》 一、QT 基础示例(一)QRadioButton 示例(二)拦截关闭事件示例 二、QT 常用代码示例(一)QObject 相关操作(二)Qt 基本容器遍历&#x…...

腾讯云流式湖仓统一存储实践
点击蓝字⬆ 关注我们 本文共计5107 预计阅读时长16分钟 * 本文将分享腾讯云流式湖仓的架构与实践。主要内容包括: 流计算Oceanus介绍腾讯云流式湖仓架构腾讯云流式湖仓实践腾讯云流式湖仓发展规划 一、流计算Oceanus介绍 随着大数据技术的发展࿰…...
18 设计模式之迭代器模式(书籍遍历案例)
一、什么是迭代器模式 迭代器模式(Iterator Pattern)是一种行为型设计模式,允许客户端通过统一的接口顺序访问一个集合对象中的元素,而无需暴露集合对象的内部实现。这个模式主要用于访问聚合对象(如集合、数组等&…...

超清4K视频素材哪里找?优质下载资源网站分享
我是你们的自媒体UP主小李。现在是高清、4K视频大行其道的时代,想要制作出吸引眼球的优质内容,超清4K视频素材必不可少。今天就为大家分享几个宝藏网站,让你的视频创作更轻松、更出彩! 蛙学网 首先推荐 蛙学网,这是国内…...

刷题日志【1】
目录 1.全排列【力扣】 代码1: 代码2: 2、子集【力扣】 3、全排列Ⅱ【力扣】 4、组合【力扣】 1.全排列【力扣】 代码1: class Solution {bool check[7];vector <int> path;vector<vector<int>> ret;public:vecto…...

【C++算法】32.前缀和_矩阵区域和
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1314. 矩阵区域和 题目描述: 解法 防止有人看不明白题目,先解释一下题目 二维前缀和思想: 使用前缀和矩阵 ret [x1,y1]~[x2,y2] D …...
使用堆栈(Stack)
集合类型(Collection)下篇_xml collection-CSDN博客 以上是堆栈的简单介绍,下方是堆栈的使用 题目:给定一个逆波兰表达式(后缀表达式)的字符串数组tokens,其中每个元素是一个操作数(数字&…...

雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1
文件: 雨晨 2610(2)0.2510 Windows 11 24H2 Iot 企业版 LTSC 2024 极简 2in1 install.esd 索引: 1 名称: Windows 11 IoT 企业版 LTSC 极简 26100.2510 描述: Windows 11 IoT 企业版 LTSC 极简 26100.2510 By YCDISM RTM 2025 24-12-07 大小: 8,176,452,990 个字节 索引: 2 …...

HDD 2025年技术趋势深度分析报告
随着数据量的指数级增长以及人工智能(AI)、物联网(IoT)、云计算和视频监控等领域的需求激增,硬盘驱动器(HDD)行业正面临着前所未有的挑战与机遇。本报告旨在深入剖析2025年HDD技术的发展方向&am…...

算法-字符串-22.括号生成
一、题目 二、思路解析 1.思路: 生成所有可能并且有效的括号组合——回溯方法 2.常用方法: a.数组,因为需要增删元素,所以选择LinkedList LinkedList<String> resnew LinkedList<>(); b.StringBuilder创建࿰…...

Free-RTOS实现LED闪烁
开发板:正点原子探索者 F407 LED定时定时闪烁 本次实验验证: 配置文件 1、打开CubeMX 2、选择芯片型号,然后点击开始项目 3、配置时钟 配置烧录引脚,与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务ÿ…...

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化
论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息: 简介: 本文的背景是基于人类语言理解的组合性特征,即语言处理本质上是层次化的:语法规则将词级别的意义组合成更大的成分的意义&…...

再谈多重签名与 MPC
目录 什么是 MPC 钱包以及它们是如何出现的 多重签名和智能合约钱包已经成熟 超越 MPC 钱包 关于小队 多重签名已经成为加密货币领域的一部分,但近年来,随着 MPC(多方计算)钱包的出现,多重签名似乎被掩盖了。MPC 钱包之…...

CTF学习24.11.19[音频隐写]
MISC07[音频隐写] 隐写术 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。隐写术的英文叫做Steganography,来源于特里特米乌斯的一本讲述密码学与隐写术的著作Steganograp…...
vue的watch是否可以取消? 怎么取消?
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 Vue 可以通过 watch API 返回的一个 取消函数,可以在需要时取消该监听。 如何取消 watch? 当你使用 Vu…...
23、枚举
1、枚举 罗列一些标识符,当做整型数据使用。为了代码的易读性 1.1、枚举定义 enum 枚举名{大写标识符,大写标识符....}; 枚举类型名:enum 枚举名 枚举里面如果不给标识符赋值,默认从0开始,依次增1 如果里面的标识符有赋值…...

Java基本概念
Java特点 简单性。容易使用,比如没有C复杂的指针 面向对象。将对象属性剥离,当属性需要大量调用时节省代码,比如把大象装进冰箱,JAVA将大象分成跑、睡觉等不同功能,当需要就调用 分布式。 健壮性 安全性 体系结构…...
C++学习——如何析构派生类
C——继承关系中的虚函数 析构派生类纯虚构函数和抽象类 析构派生类 先看一段简单的代码: #include <iostream>using namespace std;class AA { public:AA() {cout << "调用了基类构造" << endl;}virtual void func() {cout <<…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...