2 votes

Conversion de Json en objet Java - Échec dans Jackson

J'essaie d'analyser l'objet suivant en utilisant jackson en Java.

[
  [null, {
    "distance": 2272,
    "duration": 580
  }, {
    "distance": 7217,
    "duration": 1393
  }, {
    "distance": 5773,
    "duration": 1061
  }, {
    "distance": 6208,
    "duration": 1170
  }, {
    "distance": 18846,
    "duration": 2686
  }],
  [{
    "distance": 2262,
    "duration": 558
  }, null, {
    "distance": 7144,
    "duration": 1366
  }, {
    "distance": 4803,
    "duration": 801
  }, {
    "distance": 5238,
    "duration": 910
  }, {
    "distance": 17876,
    "duration": 2426
  }],
  [{
    "distance": 7207,
    "duration": 1393
  }, {
    "distance": 7505,
    "duration": 1411
  }, null, {
    "distance": 12375,
    "duration": 2010
  }, {
    "distance": 12809,
    "duration": 2119
  }, {
    "distance": 24868,
    "duration": 3462
  }],
  [{
    "distance": 7481,
    "duration": 1255
  }, {
    "distance": 4643,
    "duration": 831
  }, {
    "distance": 11497,
    "duration": 2060
  }, null, {
    "distance": 434,
    "duration": 109
  }, {
    "distance": 13197,
    "duration": 1657
  }],
  [{
    "distance": 7723,
    "duration": 1326
  }, {
    "distance": 4884,
    "duration": 902
  }, {
    "distance": 11739,
    "duration": 2130
  }, {
    "distance": 434,
    "duration": 107
  }, null, {
    "distance": 12999,
    "duration": 1628
  }],
  [{
    "distance": 20372,
    "duration": 2918
  }, {
    "distance": 17534,
    "duration": 2493
  }, {
    "distance": 25912,
    "duration": 3432
  }, {
    "distance": 13669,
    "duration": 1774
  }, {
    "distance": 13414,
    "duration": 1779
  }, null]
]

J'obtiens l'erreur suivante.

Exception dans le thread "main" java.lang.IllegalArgumentException : Impossible de construire une instance de com.beeline.DistanceMatrix (bien qu'au moins un Créateur existe) : pas de constructeur d'argument de type String ni de méthode d'usine pour désérialiser à partir d'une valeur String ('[[null,{"distance":2272,"duration":580},{"distance":7217,"duration":1393},{"distance":5773,"duration":1061},{"distance":6208,"duration":1170},{"distance":18846,"duration":2686}],[{"distance":2262,"duration":558},null,{"distance":7144,"duration":1366},{"distance": 4803,"duration":801},{"distance":5238,"duration":910},{"distance":17876,"duration":2426}],[{"distance":7207,"duration":1393},{"distance":7505,"duration":1411},null,{"distance":12375,"duration":2010},{"distance":12809,"duration":2119},{"distance":24868,"duration": 3462}],[{"distance":7481,"duration":1255},{"distance":4643,"duration":831},{"distance":11497,"duration":2060},null,{"distance":434,"duration":109},{"distance":13197,"duration":1657}],[{"distance":7723,"duration":1326},{"distance":4884,"duration":902},{"distance": 11739,"duration":2130},{"distance":434,"duration":107},null,{"distance":12999,"duration":1628}],[{"distance":20372,"duration":2918},{"distance": 17534,"duration":2493},{"distance":25912,"duration":3432},{"distance":13669,"duration":1774},{"distance":13414,"duration":1779},null]]') at [Source : UNKNOWN ; line : -1, column : -1] at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3750) à l'adresse com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3668) at com.beeline.JsonParser.(JsonParser.java:17)

Les classes que j'utilise sont

JsonParser.java

public class JsonParser {
    private DistanceMatrix matrix = new DistanceMatrix();
    public JsonParser() {
        String jsonString = "[[null,{\"distance\":2272,\"duration\":580},{\"distance\":7217,\"duration\":1393},{\"distance\":5773,\"duration\":1061},{\"distance\":6208,\"duration\":1170},{\"distance\":18846,\"duration\":2686}],[{\"distance\":2262,\"duration\":558},null,{\"distance\":7144,\"duration\":1366},{\"distance\":4803,\"duration\":801},{\"distance\":5238,\"duration\":910},{\"distance\":17876,\"duration\":2426}],[{\"distance\":7207,\"duration\":1393},{\"distance\":7505,\"duration\":1411},null,{\"distance\":12375,\"duration\":2010},{\"distance\":12809,\"duration\":2119},{\"distance\":24868,\"duration\":3462}],[{\"distance\":7481,\"duration\":1255},{\"distance\":4643,\"duration\":831},{\"distance\":11497,\"duration\":2060},null,{\"distance\":434,\"duration\":109},{\"distance\":13197,\"duration\":1657}],[{\"distance\":7723,\"duration\":1326},{\"distance\":4884,\"duration\":902},{\"distance\":11739,\"duration\":2130},{\"distance\":434,\"duration\":107},null,{\"distance\":12999,\"duration\":1628}],[{\"distance\":20372,\"duration\":2918},{\"distance\":17534,\"duration\":2493},{\"distance\":25912,\"duration\":3432},{\"distance\":13669,\"duration\":1774},{\"distance\":13414,\"duration\":1779},null]]";
        ObjectMapper oMapper = new ObjectMapper();
        oMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        oMapper.enable(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT);
        matrix = oMapper.convertValue(jsonString, DistanceMatrix.class);
        System.out.print(matrix);
    }
}

DistanceMatrix.java

public class DistanceMatrix {
    public ArrayList<ArrayList<Map<String, Float>>> matrix = new ArrayList<ArrayList<Map<String, Float>>>();
}

J'ai vu plusieurs problèmes de ce type sur GitHub et SO. Mais je n'arrive pas à comprendre pourquoi cela ne fonctionne pas. Avez-vous une idée de ce qui ne va pas ?

3voto

dnt Points 103

Votre DistanceMatrix décrit un objet JSON qui a une clé nommée matrix et une valeur correspondante de type ArrayList<ArrayList<Map<String, Float>>> .

Vous devez soit emballer votre JSON pour qu'il ressemble à { "matrix": <your actual JSON> } ou spécifier le type à convertValue directement.

0voto

Sammy Points 155

La réponse qui a fonctionné pour moi est à la fois dérivée de la réponse donnée par @dnt, de la même question dans les groupes Google et d'une expérience personnelle.

  1. D'abord cette ligne

matrix = oMapper.convertValue(jsonString, DistanceMatrix.class);

doit être changé en

try {
  matrix = oMapper.readValue(jsonString, DistanceMatrix.class);
}

Ainsi, cela va lire correctement le JSON et essayer de le faire correspondre à la structure donnée.

  1. Une fois que c'est fait, il lancera

Impossible de désérialiser l'instance de com.beeline.DistanceMatrix à partir de Jeton START_ARRAY

La raison en est que la classe de matrice de distance décrit un objet JSON. L'entrée attend { "matrix" : }

  1. Merci au commentaire fait par @ngueno. Il y aura une exception pour pointeur nul si l'objet est nul. Mais la bibliothèque peut accepter des valeurs nulles comme valeur d'objet. Exemple

Pour la classe ci-dessus, ceci est accepté

[{"distance":7217,"duration":null},{"distance":null,"duration":1061}]

Alors que cela n'est pas accepté

[{"distance":7217,"duration":1393},null]

Je suis presque sûr que vous pouvez le gérer différemment en Java (je suis un débutant). Mais j'ai remplacé tous mes nulls par la notation d'objets vides {} . Ainsi, un objet vide créera une carte sans paire clé-valeur. Je vais chercher comment stocker null dans Carte structure. Ou si quelqu'un d'autre fait un commentaire, je mettrai à jour la réponse en conséquence.

Merci pour vos contributions.

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