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

相关推荐
n***26569 小时前
MySQL JSON数据类型全解析(JSON datatype and functions)
android·mysql·json
阿巴~阿巴~2 天前
自定义协议设计与实践:从协议必要性到JSON流式处理
服务器·网络·网络协议·json·操作系统·自定义协议
最笨的羊羊2 天前
Flink CDC系列之:JSON 序列化器JsonRowDataSerializationSchemaUtils
json·flink cdc系列·serialization·json 序列化器·rowdata·schemautils
q***49863 天前
SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现
spring cloud·微服务·json
愤怒的山羊3 天前
jetcache List 缓存, json 序列化 泛型解析成了 JsonObject 处理
缓存·json·list
2***d8854 天前
使用 MySQL 从 JSON 字符串提取数据
mysql·oracle·json
TDengine (老段)4 天前
TDengine 转换函数 TO_JSON 用户手册
android·大数据·数据库·json·时序数据库·tdengine·涛思数据
wow_DG4 天前
【Python✨】VS Code 秒开 Python 类型检查:一招 mypy + settings.json 让你的 Bug 原地现形!
python·json·bug
会篮球的程序猿6 天前
html+canvas+thikphp 可视化工具拖拽、编辑生成JSON,渲染成海报图片 完全自定义,支持选择,文字背景色
前端·html·json
倚肆6 天前
Hutool-json 库完整指南
java·json