更改从Java控制器返回的JSON的默认结构

时间:2019-04-06 15:24:30

标签: java json spring serialization jackson

我有一个控制器,它以ResponseEntity的形式返回对象列表,所返回的JSON具有以下格式:

[
  {
    “name”:”a”,
    “classes”:
    [
        “1”,”2”,”3”
    ]
  }]

我想以以下格式对其进行重组:

[{“a”:[“1”,”2”,”3”]}]

我有一种预感,我必须制作自己的JSON Object并以某些带有@JsonValue注释的方法将其返回,但我不想这样做。

还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

您有两个选择:

  1. 以正确的结构将对象转换为package.json-s的列表。
  2. 编写自定义序列化程序。

在这种情况下,自定义序列化器应该很简单:

Map

简单用法:

class PojoSerializer extends JsonSerializer<Pojo> {

    @Override
    public void serialize(Pojo value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeObjectField(value.getName(), value.getClasses());
        gen.writeEndObject();
    }
}

打印:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.writeValue(System.out, Arrays.asList(new Pojo(), new Pojo()));
    }
}

@JsonSerialize(using = PojoSerializer.class)
class Pojo {
    private String name = "a";
    private List<String> classes = Arrays.asList("1", "2", "3");

    // getters, setters
}