java - unrecognized - yaml not marked as ignorable




Jackson com JSON: campo não reconhecido, não marcado como ignorável (20)

A primeira resposta está quase correta, mas o que é necessário é mudar o método getter, NÃO campo - o campo é privado (e não detectado automaticamente); além disso, os getters têm precedência sobre os campos se ambos estiverem visíveis (existem maneiras de tornar os campos privados visíveis também, mas se você quiser ter getter, não há muito sentido)

Então getter deve ser chamado de getWrapper() ou anotado com:

@JsonProperty("wrapper")

Se você preferir o nome do método getter como está.

Eu preciso converter uma certa string JSON para um objeto Java. Eu estou usando Jackson para manipulação de JSON. Eu não tenho controle sobre o JSON de entrada (eu li em um serviço da web). Esta é minha entrada JSON:

{"wrapper":[{"id":"13","name":"Fred"}]}

Aqui está um caso de uso simplificado:

private void tryReading() {
    String jsonStr = "{\"wrapper\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";
    ObjectMapper mapper = new ObjectMapper();  
    Wrapper wrapper = null;
    try {
        wrapper = mapper.readValue(jsonStr , Wrapper.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("wrapper = " + wrapper);
}

Minha classe de entidade é:

public Class Student { 
    private String name;
    private String id;
    //getters & setters for name & id here
}

Minha classe Wrapper é basicamente um objeto contêiner para obter minha lista de alunos:

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

Eu continuo recebendo esse erro e "wrapper" retorna null . Não tenho certeza do que está faltando. Alguém pode ajudar por favor?

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: 
    Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
 at [Source: java.io.[email protected]; line: 1, column: 13] 
    (through reference chain: Wrapper["wrapper"])
 at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
    .from(UnrecognizedPropertyException.java:53)

Anote os alunos de campo como abaixo, pois há incompatibilidade nos nomes da propriedade json e da propriedade java

public Class Wrapper {
    @JsonProperty("wrapper")
    private List<Student> students;
    //getters & setters here
}

De acordo com o doc você pode ignorar os campos selecionados ou todos os campos desconhecidos:

 // to prevent specified fields from being serialized or deserialized
 // (i.e. not include in JSON output; or being set even if they were included)
 @JsonIgnoreProperties({ "internalId", "secretKey" })

 // To ignore any unknown properties in JSON input without exception:
 @JsonIgnoreProperties(ignoreUnknown=true)

De minha parte, a única linha

@JsonIgnoreProperties(ignoreUnknown = true)

não funcionou também.

Basta adicionar

@JsonInclude(Include.NON_EMPTY)

Jackson 2.4.0


Esta solução é genérica ao ler fluxos json e precisa obter apenas alguns campos, enquanto campos não mapeados corretamente em suas classes de domínio podem ser ignorados:

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)

Uma solução detalhada seria usar uma ferramenta como jsonschema2pojo para gerar automaticamente as classes de domínio necessárias, como Student, do Schema of json Response. Você pode fazer o último por qualquer json on-line para conversor de esquema.


Eu consertei esse problema simplesmente mudando as assinaturas dos métodos setter e getter da minha classe POJO. Tudo o que precisei fazer foi alterar o método getObject para corresponder ao que o mapeador estava procurando. No meu caso, eu tinha um getImageUrl originalmente, mas os dados JSON tinham image_url que estava jogando o mapper off. Eu mudei meu setter e getters para getImage_url e setImage_url .

Espero que isto ajude.


Funcionou para mim com o seguinte código:

ObjectMapper mapper =new ObjectMapper();    
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Isso funciona melhor do que tudo, por favor consulte a propriedade.

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    projectVO = objectMapper.readValue(yourjsonstring, Test.class);

Isso simplesmente funcionou perfeitamente para mim

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
    DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

@JsonIgnoreProperties(ignoreUnknown = true) não o fez.


Jackson está reclamando porque não pode encontrar um campo em sua classe Wrapper que é chamado de "wrapper". Está fazendo isso porque seu objeto JSON tem uma propriedade chamada "wrapper".

Acho que a solução é renomear o campo da classe Wrapper para "wrapper" em vez de "students".


O Google me trouxe até aqui e fiquei surpreso ao ver as respostas ... todas sugeridas ignorando o erro ( que sempre volta 4 vezes mais tarde no desenvolvimento ) ao invés de resolvê-lo até que esse cavalheiro restaurado pela fé em SO!

objectMapper.readValue(responseBody, TargetClass.class)

é usado para converter um json String para um objeto de classe, o que falta é que o TargetClass deve ter get / set públicos. O mesmo está faltando no trecho de pergunta do OP também! :)

via lombok sua classe como abaixo deve funcionar !!

@Data
@Builder
public class TargetClass {
    private String a;
}

O POJO deve ser definido como

Classe de resposta

public class Response {
    private List<Wrapper> wrappers;
    // getter and setter
}

Classe de invólucro

public class Wrapper {
    private String id;
    private String name;
    // getters and setters
}

e mapeador para ler o valor

Response response = mapper.readValue(jsonStr , Response.class);

Qualquer mudança

public Class Wrapper {
    private List<Student> students;
    //getters & setters here
}

para

public Class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

---- ou ----

Alterar sua string JSON para

{"students":[{"id":"13","name":"Fred"}]}

Se você estiver usando Jackson 2.0

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

Sua string json não está alinhada com a classe mapeada. Alterar a string de entrada

String jsonStr = "{\"students\"\:[{\"id\":\"13\",\"name\":\"Fred\"}]}";

Ou mude sua classe mapeada

public class Wrapper {
    private List<Student> wrapper;
    //getters & setters here
}

Uma outra possibilidade é essa propriedade no application.properties spring.jackson.deserialization.fail-on-unknown-properties=false , que não precisará de nenhuma outra alteração de código em seu aplicativo. E quando você acredita que o contrato é estável, você pode remover essa propriedade ou marcá-la como verdadeira.


Você pode usar

ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Ele irá ignorar todas as propriedades que não estão declaradas.


Você pode usar a anotação em nível de classe de Jackson:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties

@JsonIgnoreProperties
class { ... }

Ele irá ignorar todas as propriedades que você não definiu no seu POJO. Muito útil quando você está procurando apenas algumas propriedades no JSON e não quer gravar todo o mapeamento. Mais informações no site do Jackson . Se você quiser ignorar qualquer propriedade não declarada, escreva:

@JsonIgnoreProperties(ignoreUnknown = true)

pode ser alcançado de 2 maneiras:

  1. Marcar o POJO para ignorar propriedades desconhecidas

    @JsonIgnoreProperties(ignoreUnknown = true)
  2. Configure o ObjectMapper que serializa / De-serializa o POJO / json como abaixo:

    ObjectMapper mapper =new ObjectMapper();            
    // for Jackson version 1.X        
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    // for Jackson version 2.X
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

usando Jackson 2.6.0, isso funcionou para mim:

private static final ObjectMapper objectMapper = 
    new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

e com a configuração:

@JsonIgnoreProperties(ignoreUnknown = true)






jackson