2 votes

Ignorer le RootNode et le mapping personnalisé dans Jackson/spring/Java

Comment puis-je ignorer le nom de la racine si je n'en ai pas besoin ? Je n'ai besoin que de bill.

si j'enlève "version" du json, cela fonctionne bien

mon erreur sur le log de la console

2019-07-27 19:20:14.874  WARN 12516 --- [p-nio-80-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'bill'), but FIELD_NAME; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'bill'), but FIELD_NAME
 at [Source: (PushbackInputStream); line: 8, column: 2]]

mon json ressemble à ceci

{
    "bill":
    {
        "siteId":"gkfhuj-00",
        "billId":"d6334954-d1c2-4b51-bb10-11953d9511ea"
        },
    "version":"1"
}

ma classe pour json J'ai essayé d'utiliser JsonIgnoreProperties mais cela ne m'a pas aidé et j'ai aussi écrit "version".

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonRootName(value = "bill")
public class Bill {

    private String siteId;
    private String billId;

//getters and setters

mon post méthode lisen objet Bill

    @PostMapping("/bill")
    @ResponseBody
    public ResponseEntity<String> getBill(@RequestBody Bill bill)

2voto

Coder Points 907

Comme vous vous appuyez sur le Spring boot par le biais d'annotations et de Jackson Le désérialiseur personnalisé fonctionnera parfaitement dans ce cas. Vous devez créer la classe de désérialiseur comme indiqué ci-dessous

public class BillDeserializer extends StdDeserializer<Bill> {

    public BillDeserializer() {
        this(null);
    }

    public BillDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Bill deserialize(JsonParser jp, DeserializationContext ctxt) 
      throws IOException, JsonProcessingException {

        JsonNode billNode = jp.getCodec().readTree(jp);
        Bill bill = new Bill();
        bill.setSiteId(billNode.get("bill").get("siteId").textValue());
        bill.setBillId(billNode.get("bill").get("billId").textValue());      
        return bill;
    }
}

Vous devez maintenant donner des instructions à votre Jackson pour utiliser ce désérialiseur au lieu du désérialiseur par défaut de la classe Bill classe. Pour ce faire, il convient d'enregistrer le désaromatisateur. Cela peut se faire par le biais d'une simple annotation sur la classe Bill comme @JsonDeserialize(using = BillDeserializer.class)

Votre Bill se présente généralement comme suit

@JsonDeserialize(using = BillDeserializer.class)
public class Bill {

    private String siteId;
    private String billId;

//getters and setters
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X