当前位置: 首页 > 面试题库 >

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

仇航
2023-03-14
问题内容

我正在使用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。欢迎在这方面提供任何帮助。


问题答案:

好吧,默认情况下,杰克逊在尝试确定要为包装值显示的根名称时使用两个注释之一-
@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);


 类似资料:
  • 我想用Spring靴的方式来做这件事。

  • 问题内容: 我有一个具有以下内容的JSON对象: 我想将“ _id”键更改为“ id”,这样它将变成 如何使用Javascript,jQuery或Ruby,Rails做到这一点? 谢谢。 问题答案: 这将json更改为: 由于订单在JSON中的名称/值对中没有意义,因此与您想要的结果相同。

  • 我希望获得以下输出:(我所要做的就是删除字段名,但保留其子字段名。) 以下是我的POJO,由使用: 下面是MAP在搜索过程中使用的我的: null 是否有一种方法可以使它与和一起使用,因为我不能同时使用这两种方法。 有人能帮忙解决这个问题吗?请指导我适当的文档或变通方法,非常感谢。

  • 我得到了以下代码: 我得到了这个: {"时间":{"小时": 20,"分钟": 49,"秒": 42,"纳米": 99000000,"一天": 19,"一天":"星期四","月":"一月","一天": 19,"年": 2017,"月值": 1,"年表":{"id":"ISO","calendarType":"iso8601"}}} 我要实现的是ISO8601中的字符串 2017-01-19T18:

  • 问题内容: 我和Jackson有一个问题,我认为应该很容易解决,但是这真使我丧命。 假设我有一个看起来像这样的Java POJO类(假设对我来说是Getters和Setters): 我想将看起来像这样的JSON反序列化为User对象: 杰克逊给了我一些问题,因为用户不是JSON中的第一级对象。我显然可以制作一个具有单个User对象的UserWrapper类,然后使用该对象反序列化,但是我知道必须有

  • 我和杰克逊有一个问题,我认为这个问题应该很容易解决,但它正在折磨我。 假设我有一个java POJO类,看起来像这样(假设我有getter和setter): 我想反序列化看起来像这样的JSON到一个User对象: Jackson给了我一些问题,因为User不是JSON中的第一级对象。我显然可以创建一个UserWrapper类,它有一个用户对象,然后使用它反序列化,但我知道一定有一个更优雅的解决方案