Estou usando Jackson para serialização JSON de uma lista de objetos.
Aqui está o que eu recebo:
{"ArrayList":[{"id":1,"name":"test name"}]}
Mas eu quero isso:
{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.
Abaixo está minha abordagem para isso:
Interface:
public interface MyInterface {
public long getId();
public String getName();
}
Classe de implementação:
@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
}
Serialização 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);
}
}
Teste:
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);
Aqui está o que eu recebo:
{"ArrayList":[{"id":1,"name":"test name"}]}
Mas eu quero isso:
{"rootname":[{"id":1,"name":"test name"}]} // ie showing the string I want as the root name.
Tentei todas as soluções sugeridas que encontrei, mas não consegui atingir meu objetivo. Eu olhei para:
Ou eu estou esquecendo de alguma coisa? Estou usando o jackson 1.9.12 para isso. Qualquer ajuda nesse sentido é bem-vinda.
Bem, por padrão, Jackson usa uma das duas anotações ao tentar determinar o nome raiz a ser exibido para valores agrupados - @XmlRootElement
ou @JsonRootName
. Ele espera que essa anotação esteja no tipo que está sendo serializado, caso contrário, usará o nome simples do tipo como o nome raiz.
No seu caso, você está serializando uma lista, e é por isso que o nome raiz é 'ArrayList' (nome simples do tipo que está sendo serializado). Cada elemento da lista pode ser de um tipo anotado com @JsonRootName, mas a lista em si não é .
Quando o valor raiz que você está tentando agrupar é uma coleção, você precisa definir o nome do agrupamento de alguma forma:
Você pode criar uma classe de wrapper para conter a lista, com uma anotação para definir o nome da propriedade desejada ( você só precisa usar esse método quando não tiver controle direto do ObjectMapper
processo de transformação / 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);
Esta é a opção preferível. Use uma ObjectWriter
instância configurada para gerar o JSON. Em particular, estamos interessados no withRootName
método:
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);
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras