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

相关推荐
bing_1585 小时前
Spring MVC 根据请求头 (如 Accept) 怎么返回 JSON 或 XML 数据?
spring·json·mvc
半路_出家ren10 小时前
python处理异常,JSON
python·json·异常处理
傻小胖15 小时前
json-server的用法-基于 RESTful API 的本地 mock 服务
后端·json·restful
search716 小时前
配置文件介绍xml、json
xml·json
Chandler242 天前
Go语言:json 作用和语法
开发语言·golang·json
Hfc.2 天前
docker-daemon.json
docker·容器·json
UpUpUp……3 天前
Linux--JsonCpp
linux·运维·服务器·c++·笔记·json
wtsolutions3 天前
Excel-to-JSON插件专业版功能详解:让Excel数据转换更灵活
json·excel·excel-to-json·wtsolutions·专业版
kerryYG4 天前
使用JMETER中的JSON提取器实现接口关联
jmeter·json
柯ran4 天前
JSON|cJSON 介绍以及具体项目编写
c语言·链表·json·github