Voici mon Java qui est utilisé pour la dé-sérialisation, j'essaie de convertir une chaîne json en objet Java. Ce faisant, j'ai utilisé le code suivant:
package ex1jackson;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import Java.io.IOException;
public class Ex1jackson {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
try {
String userDataJSON = "[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
+ "{\"id\": \"value21\",\"name\":\"value22\",\"qty\": \"value23\"}]";
product userFromJSON = mapper.readValue(userDataJSON, product.class);
System.out.println(userFromJSON);
} catch (JsonGenerationException e) {
System.out.println(e);
} catch (JsonMappingException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
}
et ma classe product.Java
package ex1jackson;
public class product
{
private String id;
private String name;
private String qty;
@Override
public String toString() {
return "Product [id=" + id+ ", name= " + name+",qty="+qty+"]";
}
}
je reçois l'erreur suivante.
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at
[Source: Java.io.StringReader@16f76a8; line: 1, column: 8] (through reference chain: ex1jackson.product["id"])
BUILD SUCCESSFUL (total time: 0 seconds)
aidez-moi à résoudre ce problème,
On dirait que vous essayez de lire un objet à partir de JSON qui décrit réellement un tableau. Java sont mappés sur des objets JSON avec des accolades {}
, Mais votre JSON commence réellement par des crochets []
Désignant un tableau.
Ce que vous avez réellement, c'est un List<product>
. Pour décrire les types génériques, en raison de l'effacement du type de Java, vous devez utiliser un TypeReference
. Votre désérialisation pourrait se lire comme suit: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});
Quelques autres notes: vos cours devraient toujours être CamelCased. Votre méthode principale peut simplement être public static void main(String[] args) throws Exception
, ce qui vous enregistre tous les blocs inutiles catch
.
Vous devez changer la ligne
product userFromJSON = mapper.readValue(userDataJSON, product.class);
à
product[] userFromJSON = mapper.readValue(userDataJSON, product[].class);
puisque vous désérialisez un tableau (au fait: vous devriez commencer les noms de classe par des lettres majuscules, comme mentionné précédemment). En outre, vous devez créer des méthodes de définition pour vos champs ou les marquer comme publiques pour que cela fonctionne.
Edit: Vous pouvez également suivre la suggestion de Steven Schlansker et utiliser
List<product> userFromJSON =
mapper.readValue(userDataJSON, new TypeReference<List<product>>() {});
au lieu de cela si vous voulez éviter les tableaux.
JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"
System.out.println("id : "+node.findValues("id").get(0).asText());
cela a également fait l'affaire.
Votre classe product
a besoin d'un constructeur sans paramètre. Vous pouvez le rendre privé, mais Jackson a besoin du constructeur.
Remarque: vous devez utiliser une casse Pascal pour les noms de classe. C'est Product
et non pas product
.