use*_*861 26 java json root jackson
我正在使用Jackson进行JSON序列化对象列表.
这是我得到的:
{"ArrayList":[{"id":1,"name":"test name"}]}
Run Code Online (Sandbox Code Playgroud)
但我想要这个:
{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.
Run Code Online (Sandbox Code Playgroud)
以下是我对此的处理方法:
接口:
public interface MyInterface {
public long getId();
public String getName();
}
Run Code Online (Sandbox Code Playgroud)
实施班:
@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
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
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);
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
{"ArrayList":[{"id":1,"name":"test name"}]}
Run Code Online (Sandbox Code Playgroud)
但我想要这个:
{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有我能找到的建议解决方案,但未能实现我的目标.我看过:
或者我错过了什么?我正在使用杰克逊1.9.12.欢迎提供这方面的任何帮助.
Per*_*ion 31
好吧,默认情况下,Jackson在尝试确定要为包装值显示的根名称时使用两个注释之一 - @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);
Run Code Online (Sandbox Code Playgroud)
这是更好的选择.使用已配置的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);
Run Code Online (Sandbox Code Playgroud)
小智 11
@JsonTypeName("usuarios")
@JsonTypeInfo(include= JsonTypeInfo.As.WRAPPER_OBJECT,use= JsonTypeInfo.Id.NAME)
public class UsuarioDT extends ArrayList<Usuario> {
@JsonProperty("rowsAffected")
private Integer afectados;
public Integer getAfectados() {
return afectados;
}
public void setAfectados(Integer afectados) {
this.afectados = afectados;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道,我迟到了,但我有更好的方法,不需要Holder/Wrapper Class.它从注释中选择根密钥.
package com.test;
import com.fasterxml.jackson.annotation.JsonRootName;
@JsonRootName("Products")
public class ProductDTO {
private String name;
private String description;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试类: -
package com.test;
import java.io.IOException;
import java.util.ArrayList;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ProductDTOTestCase {
@Test
public void testPersistAndFindById() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
ProductDTO productDTO = new ProductDTO();
productDTO.setDescription("Product 4 - Test");
ArrayList<ProductDTO> arrayList = new ArrayList<ProductDTO>();
arrayList.add(productDTO);
String rootName = ProductDTO.class.getAnnotation(JsonRootName.class).value();
System.out.println(mapper.writer().withRootName(rootName).writeValueAsString(arrayList));
}
}
Run Code Online (Sandbox Code Playgroud)
它将给出以下输出
{"Products":[{"name":null,"description":"Product 4 - Test"}]}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
50314 次 |
最近记录: |