web-dev-qa-db-fra.com

jackson désérialisation json en objets Java

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,

27
MAHI

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.

37
Steven Schlansker

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.

17
nutlike
 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.

6
MAHI

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.

2
Esteban Araya