java - spring boot jackson string to json parse




Serializando com Jackson(JSON)-recebendo “Nenhum serializador encontrado”? (10)

Aqui estão as três opções:

  1. Dados / classes que foram acessados ​​precisam ser public
  2. Se não for public , adicione getters & setters
  3. Ou adicione @JsonIgnore("context")

https://code.i-harness.com

Eu recebo uma exceção ao tentar serializar um objeto muito simples usando Jackson. O erro:

org.codehaus.jackson.map.JsonMappingException: Nenhum serializador encontrado para a classe MyPackage.TestA e nenhuma propriedade descoberta para criar BeanSerializer (para evitar exceções, desative SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))

Abaixo está a classe simples e código para serializar.

Alguém pode dizer o meu porque eu recebo este erro?

public class TestA {
    String SomeString = "asd";
}

TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
    String testAString = om.writeValueAsString(testA); // error here!

    TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Como já foi descrito, a configuração padrão de uma instância do ObjectMapper é apenas acessar propriedades que são campos públicos ou que possuem getters / setters públicos. Uma alternativa para alterar a definição de classe para tornar um campo público ou para fornecer um getter / setter público é especificar (para o VisibilityChecker subjacente) uma regra de visibilidade de propriedade diferente. Jackson 1.9 fornece o método de conveniência ObjectMapper.setVisibility() para fazer isso. Para o exemplo da pergunta original, provavelmente configuraria isso como

myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);

Para Jackson> 2.0:

myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

Para obter mais informações e detalhes sobre as opções de configuração relacionadas, recomendo revisar os JavaDocs no ObjectMapper.setVisibility() .


Este erro também é lançado se você esquecer de adicionar o método .build () ao seu status de retorno.

return Response.status(Status.OK);         // fails
return Response.status(Status.OK).build(); // works

Eu tenho o seguinte erro sem o método build ():

org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.sun.jersey.core.spi.factory.ResponseBuilderImpl

Eu encontrei pelo menos três maneiras de fazer isso:

  1. Adicione public getters em sua entidade que você tente serializar;
  2. Adicione uma anotação no topo da entidade, se você não quiser public getters . Isso alterará o padrão de Jackson de Visbility=DEFAULT para @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) onde quaisquer modificadores de acesso serão aceitos;
  3. Altere seu ObjectMapper globalmente, definindo objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY); . Isso deve ser evitado se você não precisar dessa funcionalidade globalmente.

Escolha com base em suas necessidades.


Eu tive o mesmo problema para uma classe filha onde eu tinha controle, o mapeador de objetos estava em um módulo comum e estava inacessível. Eu resolvi adicionando essa anotação para minha classe filha cujo objeto era serializado.

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

Eu tive um problema semelhante com carregamento lento por meio do objeto de proxy de hibernação. Deu a volta anotando a classe tendo propriedades privadas carregadas com:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

O problema pode ser porque você declarou variável como private . Se você mudar para public , funciona.

A melhor opção é usar os métodos getter e setter para isso.

Isso vai resolver o problema!


Para Jackson serializar essa classe, o campo SomeString precisa ser public (neste momento, é o isolamento no nível do pacote) ou você precisa definir os métodos getter e setter para isso.


Se você pode editar a classe que contém esse objeto, eu costumo adicionar a anotação

import com.fasterxml.jackson.annotation.JsonIgnore;

@JsonIgnore 
NonSerializeableClass obj;

SpringBoot2.0, eu resolvo seguindo o código:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}






jackson