如何使用 Jackson Streaming 创建对象数组 API

How to create Array of Objects using the Jackson Streaming API

我正在尝试使用 Jackson Streaming API 创建 JSON。我知道如何使用 Jackson 在 JSON 中创建一个元素数组,因为我们有很多与之相关的示例。但是我对如何使用它创建一个对象数组有点困惑。

下面是我最后想得到的JSON结构:

{
  "name" : "Batman",
  "year" : 2008,
  "writers":[
    {
      "name" : "Nolan",
      "age"  : 49
    },
    {
      "name" : "Johnathan",
      "age"  : 35
    }
  ]
}

以下是我的代码:

import org.json.JSONObject;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;

public class HelloWorld {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        ByteArrayOutputStream jsonStream = new ByteArrayOutputStream();
        JsonGenerator jsonGenerator = mapper.getFactory().createGenerator(jsonStream, JsonEncoding.UTF8);
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", "Batman");
        jsonGenerator.writeNumberField("year", 2008);
        jsonGenerator.writeFieldName("writers");
        jsonGenerator.writeStartArray();
        // How to to create here objects and add it to the "writers"
        // Should I create another JsonGenerator and create objects usign it?
        jsonGenerator.writeEndArray();
        jsonGenerator.writeEndObject();
        jsonGenerator.close();
        String jsonData = new String(jsonStream.toByteArray(), "UTF-8");
        JSONObject json = new JSONObject(jsonData);
        System.out.println(json.toString(4));
    }
}

有人可以指导我如何创建对象并将它们一一添加到数组中吗?我找不到这样的例子,所以在这里发帖。

我只想创建一个 Map 来存储数据。对于 writers,您可以调用 List.of 来创建内联 List

import java.io.*;
import java.util.*;
import com.fasterxml.jackson.databind.*;

public class MovieDataWriter {
    public static void main(String[] args) {
        Map<String, Object> movieData = createMap(
            "name", "Batman",
            "year", 2008,
            "writers", List.of(
                createMap(
                    "name", "Nolan",
                    "age", 49
                ),
                createMap(
                    "name", "Johnathan",
                    "age", 35
                )
            )
        );
        writeToFile(movieData, "target/batman.json");
    }
    
    private static void writeToFile(Map<String, Object> data, String filename) {
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter();
        try {
            writer.writeValue(new File(filename), data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static Map<String, Object> createMap(Object ...args) {
        Map<String, Object> pairs = new LinkedHashMap<>();
        for (int i = 0; i < args.length; i += 2) {
            pairs.put(String.valueOf(args[i]), args[i + 1]);
        }
        return pairs;
    }
}

依赖关系

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.1</version>
</dependency>

batman.json

{
  "name" : "Batman",
  "year" : 2008,
  "writers" : [ {
    "name" : "Nolan",
    "age" : 49
  }, {
    "name" : "Johnathan",
    "age" : 35
  } ]
}

在尝试了一些东西之后,我终于得到了它。基本上,我必须做我在问题中被问到的同样的事情。我不确定为什么它第一次不起作用,也许我错过了什么。无论如何,这里是如何使用 Jackson Streaming API 将对象添加到数组中。发布这个,因为它可能对将来的其他人有益。

在这种情况下,我正在创建一个数组 writers,并使用相同的 jsonGeneratorobjects 添加到其中。

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.json.JSONObject;

import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;

public class HelloWorld {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        ByteArrayOutputStream jsonStream = new ByteArrayOutputStream();
        JsonGenerator jsonGenerator = mapper.getFactory().createGenerator(jsonStream, JsonEncoding.UTF8);
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", "Batman");
        jsonGenerator.writeNumberField("year", 2008);
        jsonGenerator.writeFieldName("writers");
        jsonGenerator.writeStartArray();
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", "Nolan");
        jsonGenerator.writeNumberField("age", 45);
        jsonGenerator.writeEndObject();
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("name", "Johanathan");
        jsonGenerator.writeNumberField("age", 35);
        jsonGenerator.writeEndObject();
        jsonGenerator.writeEndArray();
        jsonGenerator.writeEndObject();
        jsonGenerator.close();
        String jsonData = new String(jsonStream.toByteArray(), "UTF-8");
        JSONObject json = new JSONObject(jsonData);
        System.out.println(json.toString(4));
    }
}

你会得到这样的输出:

{
    "year": 2008,
    "name": "Batman",
    "writers": [
        {
            "name": "Nolan",
            "age": 45
        },
        {
            "name": "Johanathan",
            "age": 35
        }
    ]
}