我正在使用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类,它有一个用户对象,然后使用它反序列化,但我知道一定有一个更优雅的解决方案