小编典典

如何使用Jackson重命名JSON序列化中的根密钥

json

我正在使用Jackson对对象列表进行JSON序列化。

这是我得到的:

{"ArrayList":[{"id":1,"name":"test name"}]}

但是我想要这个:

{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.

下面是我的处理方法:

接口:

public interface MyInterface {
    public long getId();
    public String getName();
}

实现类:

@JsonRootName(value = "rootname")
public class MyImpl implements MyInterface {
    private final long id;
    private String name;

    public MyImpl(final long id,final name) {
        this.id = id;
        this.name = name;
    }

   // getters     
}

JSon序列化:

public class MySerializer {
    public static String serializeList(final List<MyInterface> lists) {
        //check for null value.Throw Exception
        final ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
        return mapper.writeValueAsString(lists);
    }
}

测试:

final List<MyInterface> list = new ArrayList<MyImpl>();
MyImpl item = new MyImpl(1L,"test name");
list.add(item);
final String json = MySerializer.serializeList(list);
System.out.println(json);

这是我得到的:

{"ArrayList":[{"id":1,"name":"test name"}]}

但是我想要这个:

{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root     name.

还是我错过了什么?我为此使用杰克逊1.9.12。欢迎在这方面提供任何帮助。


阅读 371

收藏
2020-07-27

共1个答案

小编典典

好吧,默认情况下,杰克逊在尝试确定要为包装值显示的根名称时使用两个注释之一-
@XmlRootElement@JsonRootName。它希望此批注位于要序列化的类型上,否则它将使用该类型的简单名称作为根名称。

在您的情况下,您要序列化列表,这就是为什么根名称为’ArrayList’(要序列化的类型的简单名称)的原因。列表中的每个元素都可以是@JsonRootName注释的类型,但列表本身
不是

当您尝试包装的根值是一个集合时,则需要某种方式来定义包装名称:

支架/包装类

您可以创建一个包装器类来保存列表,并带有用于定义所需属性名称的注释( 仅当您不直接控制ObjectMapper/
JSON转换过程时,才需要使用此方法
):

class MyInterfaceList {
    @JsonProperty("rootname")
    private List<MyInterface> list;

    public List<MyInterface> getList() {
        return list;
    }

    public void setList(List<MyInterface> list) {
        this.list = list;
    }
}

final List<MyInterface> lists = new ArrayList<MyInterface>(4);
lists.add(new MyImpl(1L, "test name"));
MyInterfaceList listHolder = new MyInterfaceList();
listHolder.setList(lists);
final String json = mapper.writeValueAsString(listHolder);

对象作家

这是更可取的选择。使用配置的ObjectWriter实例生成JSON。我们特别对这种withRootName方法感兴趣:

final List<MyInterface> lists = new ArrayList<MyInterface>(4);
lists.add(new MyImpl(1L, "test name"));
final ObjectWriter writer = mapper.writer().withRootName("rootName");
final String json = writer.writeValueAsString(lists);
2020-07-27