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

相关推荐
面朝大海,春不暖,花不开11 小时前
结构化数据格式解析:JSON 与 XML 的技术应用与实践
xml·json
PythonicCC14 小时前
Django核心知识点详解:JSON、AJAX、Cookie、Session与用户认证
ajax·django·json
-凌凌漆-16 小时前
【Qt】Qt QML json处理
开发语言·qt·json
racerun1 天前
UniApp中的pages.json 和 tabBar
uni-app·json
我命由我123451 天前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js
Code季风2 天前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul
yjb.gz2 天前
Oracle函数JSON_TABLE使用
数据库·oracle·json
百锦再4 天前
.Net配置文件appsetting.json的几种读取方法
chrome·json·.net·依赖注入·appsetting·web.config
葬歌倾城5 天前
JSON的缩进格式方式和紧凑格式方式
c#·json
火车叨位去19496 天前
Java中的JSON序列化和反序列化
json