Jackson - JsonGenerator创建JSON、JsonParser解析JSON

以下是关于如何使用Jackson的JsonGenerator类来创建JSON内容以及如何使用JsonParser类来读取JSON内容的教程。

依赖项

首先,在pom.xml文件中添加以下依赖项以引入Jackson库:

xml 复制代码
<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内容

步骤:

  1. 创建JsonFactory实例。
  2. 使用JsonFactory创建JsonGenerator
  3. 使用JsonGenerator的方法构建JSON结构。
  4. 关闭JsonGenerator

示例代码:

java 复制代码
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();

        // 创建JsonGenerator
        JsonGenerator 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内容:

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内容。

步骤:

  1. 创建JsonParser使用JsonFactory.createJsonParser()方法。
  2. 使用nextToken()方法遍历每个JSON字符串作为token。
  3. 检查每个token并相应处理。

示例代码:

java 复制代码
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");

        // 创建JsonParser
        JsonParser 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服务交互或处理配置文件非常有用。

相关推荐
制造数据与AI践行者老蒋9 小时前
离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争
数据库·microsoft·json
chenjingming66615 小时前
JWT(JSON Web Token)有效期查看登录过期时间
json
绘梨衣的sakura路1 天前
Fastjson ≤ 1.2.83 新型 RCE 漏洞深度分析:三层绕过机制与完整利用链
安全·web安全·json
江湖十年2 天前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
前网易架构师-高司机2 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
前网易架构师-高司机2 天前
带标注的浮游藻类24种数据集,识别率91.5 %数据集, 23175张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·数据集·微观·生物·浮游·藻类
维天说2 天前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
一颗小行星-4 天前
为什么有的JSON可以带注释?
json
CedarQR5 天前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
Geoking.6 天前
JSON vs JSONL:从数据格式到 AI Agent 的工程实践
人工智能·深度学习·json