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

相关推荐
howard200517 小时前
4.4 Spark SQL数据源 - JSON
json·spark sql数据源
灰子学技术18 小时前
Envoy gRPC-JSON 转码器功能实现分析
json
夜雪闻竹19 小时前
Cursor 的 state.vscdb 解析踩坑记
json·aigc·ai编程
水煮白菜王20 小时前
JSONEditor 使用指南
前端·javascript·chrome·json
会编程的土豆2 天前
Gin 中 `c.BindJSON` 与 `c.JSON` 详细讲解
c语言·json·gin
ID_180079054732 天前
企业级实战:淘宝商品详情 API简要说明,json数据返回参考
json
学习3人组3 天前
业务主表+JSON自定义字段
java·spring boot·json
Car123 天前
在vscode中添加一个tasks.json实现 rt thread的scons编译功能
vscode·json·build·scons
学习3人组3 天前
基于 主表 + JSON 自定义字段的条件查询
json
XMYX-03 天前
28 - Go JSON 数据操作
开发语言·golang·json