2 votes

Json vers Java Object - Échec en raison de champs identiques

J'essaie de convertir un json en un objet java. Comme il y a des champs identiques dans le json, il y a une erreur comme celle-ci.

com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property "amount": 
com.gateway.model.Order#setAmount(1 params) vs com.gateway.model.Order#setAmount(1 params)

Voici le json (partie liée à mon problème)

   "order":{  
      "amount":1.000,
      "chargeback":{  
         "amount":0,
         "currency":"BHD"
      },
   }

C'est la partie pertinente de la classe Java.

public class Order
{

    private double amount;
    Chargeback ChargebackObject;

    // Getter Methods

    public double getAmount()
    {
        return amount;

    // Setter Methods
    public void setAmount(double amount)
    {
        this.amount = amount;
    }
}

class Chargeback
{
    private double amount;
    private String currency;

    // Getter Methods
    @JsonIgnore
    public double getAmount()
    {
        return amount;
    }

    @JsonInclude(Include.NON_NULL)
    public String getCurrency()
    {
        return currency;
    }

    // Setter Methods 

    public void setAmount(double cb_amount)
    {
        this.amount = cb_amount;
    }

    public void setCurrency(String currency)
    {
        this.currency = currency;
    }  
}

Veuillez noter que la classe Chargeback se trouve dans le fichier Order.java.

J'ai essayé @JsonIgnore et en supprimant l'annotation amount dans le chargeback mais l'erreur persiste. Quelqu'un peut-il suggérer une solution à ce problème ?

2 votes

Il semble que vous ayez deux méthodes avec le même nom ( setAmount ) entre ces deux classes ; vous devez renommer l'une des propriétés ou indiquer à Jackson laquelle est laquelle. Essayez de renommer votre montant de commande en "quantité" et setAmount en setQuantity, puisque cela exprime mieux ce que vous essayez d'accomplir de toute façon.

0 votes

@AustinSchäfer C'était exactement le cas. Il s'agissait d'une classe énorme avec beaucoup de variables et de méthodes, et je ne sais comment, je l'ai manqué. Merci de me l'avoir signalé :)

1voto

Sambit Points 442

J'ai modifié votre code, essayez le code ci-dessous. En fait, j'ai fait ce qui suit.

  1. Il n'y avait pas de getter et setter pour l'objet Chargeback dans Order, donc il a été ajouté.
  2. Les annotations @JsonIgnore ont été commentées.

Les classes sont indiquées ci-dessous

class Chargeback {
      private double amount;
      private String currency;

      // Getter Methods
    //  @JsonIgnore
      public double getAmount() {
        return amount;
      }

    //  @JsonInclude(Include.NON_NULL)
      public String getCurrency() {
        return currency;
      }

      // Setter Methods

      public void setAmount(double cb_amount) {
        this.amount = cb_amount;
      }

      public void setCurrency(String currency) {
        this.currency = currency;
      }
    }

    public class Order {
      private double amount;
      Chargeback ChargebackObject;

      public double getAmount() {
        return amount;
      }

      public void setAmount(double amount) {
        this.amount = amount;
      }

      public Chargeback getChargebackObject() {
        return ChargebackObject;
      }

      public void setChargebackObject(Chargeback chargebackObject) {
        ChargebackObject = chargebackObject;
      }
    }

Le code à tester pour générer Json est donné ci-dessous.

public class Test1 {
  public static void main(String[] args) throws Exception {

    Chargeback chargeback = new Chargeback();
    chargeback.setAmount(1234.00);
    chargeback.setCurrency("BHD");
    Order order = new Order();
    order.setAmount(2345.00);
    order.setChargebackObject(chargeback);

    ObjectMapper mapper = new ObjectMapper();
    String toJson = null;
    try {
      toJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(order);
    } catch (IOException e) {
      e.printStackTrace();
    }
    System.out.println("Complete Json = " + toJson);

// From Json String to Java Object
ObjectMapper mapper1 = new ObjectMapper();
Order order1 = mapper.readValue(toJson, Order.class);
System.out.println("Order Object -> " + order1);
  }
}

Générer le json est donné ci-dessous.

{
  "amount" : 2345.0,
  "chargebackObject" : {
    "amount" : 1234.0,
    "currency" : "BHD"
  }
}

0 votes

Merci pour la réponse Sambit. Mais je veux convertir un json en un objet java. Quoi qu'il en soit, je vais examiner votre suggestion, puisqu'il s'agit de modifier le code de l'ObjectMapper. +1 :)

1 votes

J'ai également mis à jour la réponse. Merci de m'en informer.

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