【问题标题】:How to create Array of Objects using the Jackson Streaming API如何使用 Jackson Streaming API 创建对象数组
【发布时间】:2021-03-18 16:49:08
【问题描述】:

我正在尝试使用 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));
    }
}

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

【问题讨论】:

  • 仍在寻找答案。任何使用 Jackson Streaming API 的帮助都会有所帮助。

标签: java json object jackson


【解决方案1】:

我会创建一个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。我只是在这里使用了我的一部分代码来举例,但是我的输入更加复杂和庞大,所以我被告知要使用Jackson Streaming API。您对我如何使用它有什么建议吗?
  • @BATMAN_2008 您的代码耦合度太高,没有显示对提供的数据进行泛化或抽象化的尝试。您需要通过提供更好的示例来改进您的问题。
  • 我已经修改了代码。如果你运行它,那么你应该能够得到类似这样的响应:{ "year": 2008, "name": "Batman", "writers": [] }。基本上,我想知道如何将JSON Objects 添加到我使用 Jackson Streaming API 创建的Writers Array 中。
【解决方案2】:

在尝试了几件事后,我得到了它。基本上,我必须做与我在问题中被问到的相同的事情。我不确定为什么它第一次不起作用,也许我错过了一些东西。无论如何,这里是如何使用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
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多