Não é possível desserializar a instância do java.util.ArrayList fora do token START_OBJECT
Estou tentando postar um Listde objetos personalizados. Meu JSON no corpo da solicitação é este:
Código do lado do servidor que lida com a solicitação:
Entidade COrder:
Mas uma exceção é lançada:
at [Source: org.apache.catalina.connector.CoyoteInputStream@6de8c535; line: 1, column: 1]
java spring jackson jax-rs resteasy
— isah
O problema é o JSON - isso não pode, por padrão, ser desserializado para um Collectionporque, na verdade, não é um array JSON - seria assim:
Como você não está controlando o processo exato de desserialização (o RestEasy faz) - uma primeira opção seria simplesmente injetar o JSON como um Stringe então assumir o controle do processo de desserialização:
Você perderia um pouco da comodidade de não ter que fazer isso sozinho, mas resolveria facilmente o problema.
Outra opção - se você não pode alterar o JSON - seria construir um wrapper para ajustar a estrutura de sua entrada JSON - e usá-lo em vez de Collection<COrder>.
Ótimo, envolvi-me na coleção porque havia um exemplo nos documentos do Resteasy, mas era com XML.
@isah agradável, você pode compartilhar esse link RESTEasy aqui, por favor
— nanospeck
pensando bem. Tenho certeza de que tenho o código certo e depuro-o por horas e altero meus códigos ao longo do caminho. Acontece que eu estava faltando colchetes para indicar que minha postagem é uma matriz. Bem, eu acho que isso é uma maldição para iniciantes, risos. Para quem é novo no JSON e no Spring Data, não siga meus passos. :(
— iamjoshua
O código não está funcionando para mim, no controlador, qual deve ser o código esperado?
— prem30488 9/06
Em vez do documento JSON, você pode atualizar o objeto ObjectMapper como abaixo:
— Salah Atwa
Obrigado, a resposta me ajudou
Fantástico! Você salvou um dia.
— Herve Mutombo
obrigado, consulte o nosso site mboot.herokuapp.com , publicamos artigos relacionados a java - spring-boot
Isso funcionará:
O problema pode ocorrer quando você está tentando ler uma lista com um único elemento como um JsonArray em vez de um JsonNode ou vice-versa.
Como você não pode ter certeza se a lista retornada contém um único elemento (portanto, o json se parece com isso {...} ) ou vários elementos (e o json se parece com isso [{...}, {... }] ) - você terá que verificar em tempo de execução o tipo do elemento.
(Nota: neste exemplo de código, estou usando com.fasterxml.jackson)
Relacionado à resposta de Eugen, você pode resolver esse caso específico criando um objeto POJO de wrapper que contém a Collection<COrder>como sua variável de membro. Isso orientará adequadamente Jackson a colocar os Collectiondados reais dentro da variável de membro do POJO e produzir o JSON que você está procurando na solicitação da API.
Em seguida, defina o tipo de parâmetro COrderRestService.postOrder()como seu novo ApiRequestPOJO do wrapper em vez de Collection<COrder>.
— Adil B
Encontrei esse mesmo problema hoje em dia e talvez mais alguns detalhes possam ser úteis para outra pessoa.
Eu estava procurando algumas diretrizes de segurança para APIs REST e cruzei um problema muito intrigante com matrizes json. Verifique o link para obter detalhes, mas, basicamente, você deve envolvê-los em um Objeto, como já vimos nesta pergunta.
"name": "order2"
É aconselhável que sempre façamos:
Isso é bastante direto quando você faz um GET , mas pode lhe dar alguns problemas se, em vez disso, você estiver tentando POST / PUT o mesmo json.
No meu caso, eu tinha mais de um GET que era uma lista e mais de um POST / PUT que receberia o mesmo json.
Então, o que acabei fazendo foi usar um objeto Wrapper muito simples para uma Lista :
public Wrapper(List<T> data) {
A serialização de minhas listas foi feita com um @ControllerAdvice :
public class JSONResponseWrapper implements ResponseBodyAdvice<Object> {
if (body instanceof List) {
return new Wrapper<>((List<Object>) body);
else if (body instanceof Map) {
return Collections.singletonMap("data", body);
Portanto, todas as listas e mapas foram agrupadas em um objeto de dados como abaixo:
A desserialização ainda era o padrão, apenas usando o Objeto Wrapper :
@PostMapping("/resource")
public ResponseEntity<Void> setResources(@RequestBody Wrapper<ResourceDTO> wrappedResources) {
List<ResourceDTO> resources = wrappedResources.getData();
Foi isso! Espero que ajude alguém.
Nota: testado com SpringBoot 1.5.5.RELEASE .
— Reginaldo Santos
a classe wrapper é genuína
— Omid Rostami
Eu tive esse problema em uma API REST que foi criada usando a estrutura Spring. A adição de uma anotação @ResponseBody (para tornar a resposta JSON) a resolveu.
— Vai fazer
Normalmente, enfrentamos esse problema quando há um problema no mapeamento do nó JSON com o do objeto Java. Eu enfrentei o mesmo problema porque, na arrogância, o nó foi definido como da matriz Type e o objeto JSON estava tendo apenas um elemento; portanto, o sistema estava tendo dificuldade em mapear uma lista de elementos para uma matriz.
Em Swagger, o elemento foi definido como
Embora deva ser
E TestNewdeve ser do tipo array
— Ambuj Sinha
— Dipen Chawla
O mesmo problema:
O que causou foi o seguinte:
No meu teste, defini propositadamente a solicitação como nula (sem conteúdo POST). Como mencionado anteriormente, a causa do OP foi a mesma, porque a solicitação não continha um JSON válido, portanto não pôde ser automaticamente identificada como uma solicitação de aplicativo / json, que era a limitação no servidor ( consumes = "application/json"). Uma solicitação JSON válida seria. O que o corrigiu foi o preenchimento de uma entidade com corpo nulo e cabeçalhos json explicitamente.
No meu caso, o erro estava sendo mostrado porque, quando eu estava lendo meu arquivo JSON usando a biblioteca Jackson, meu arquivo JSON continha apenas 1 objeto. Por isso, começou com "{" e terminou com "}". Mas enquanto lia e armazenava em uma variável, eu estava armazenando em um objeto Array (como no meu caso, poderia haver mais de 1 objeto).
Portanto, adicionei "[" no início e "]" no final do meu arquivo JSON para convertê-lo em uma matriz de objetos e funcionou perfeitamente sem nenhum erro.
— Akshay Chopra
Como mencionado acima, o seguinte resolveria o problema: mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
No entanto, no meu caso, o provedor fez essa serialização [0..1] ou [0 .. *] em vez de um bug e eu não pude aplicar a correção. Por outro lado, não queria impactar meu mapeador estrito para todos os outros casos que precisam ser validados estritamente.
Então eu fiz um Jackson NASTY HACK (que não deve ser copiado em geral ;-)), especialmente porque meu SingleOrListElement tinha apenas poucas propriedades para corrigir:
@JsonProperty(value = "SingleOrListElement", access = JsonProperty.Access.WRITE_ONLY)
private Object singleOrListElement;
public List<SingleOrListElement> patch(Object singleOrListElement) {
if (singleOrListElement instanceof List) {
return (ArrayList<SingleOrListElement>) singleOrListElement;
LinkedHashMap map = (LinkedHashMap) singleOrListElement;
return Collections.singletonList(SingletonList.builder()
.property1((String) map.get("p1"))
.property2((Integer) map.get("p2"))
— phirzel
@JsonFormat (com = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List <COrder> pedidos;
— Suhas Saheer
Por favor, forneça uma resposta completa com alguns blocos de código de código dentro e algum texto avaliar a justeza da sua resposta