it-swarm.com.de

jackson deserialization json to Java-objects

Hier ist mein Java Code, der für die Deserialisierung verwendet wird, ich versuche, JSON-Zeichenfolge in Java Objekt zu konvertieren. Dabei habe ich das verwendet folgenden Code:

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);
    } 
}
}

und mein Produkt. Java-Klasse

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+"]";
}
}

ich erhalte den folgenden Fehler.

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at 
[Source: [email protected]; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds)

hilf mir das zu lösen,

27
MAHI

Sie versuchen anscheinend, ein Objekt aus JSON zu lesen, das tatsächlich ein Array beschreibt. Java Objekte werden mit geschweiften Klammern {} Auf JSON-Objekte abgebildet, aber Ihr JSON beginnt tatsächlich mit eckigen Klammern [], Die ein Array bezeichnen.

Was Sie tatsächlich haben, ist ein List<product> Um generische Typen zu beschreiben, müssen Sie aufgrund von Javas Typlöschung ein TypeReference verwenden. Ihre Deserialisierung könnte lauten: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

Noch ein paar Anmerkungen: Ihre Klassen sollten immer CamelCased sein. Ihre Hauptmethode kann einfach public static void main(String[] args) throws Exception sein, wodurch Sie alle nutzlosen catch Blöcke sparen.

37

Sie müssen die Zeile ändern

product userFromJSON = mapper.readValue(userDataJSON, product.class);

zu

product[] userFromJSON = mapper.readValue(userDataJSON, product[].class);

da Sie ein Array deserialisieren (übrigens: Sie sollten Ihre Klassennamen wie oben erwähnt mit Großbuchstaben beginnen). Außerdem müssen Sie Setter-Methoden für Ihre Felder erstellen oder als öffentlich markieren, damit dies funktioniert.

Bearbeiten: Sie können auch mit Steven Schlansker Vorschlag gehen und verwenden

List<product> userFromJSON =
        mapper.readValue(userDataJSON, new TypeReference<List<product>>() {});

stattdessen, wenn Sie Arrays vermeiden möchten.

17
nutlike
 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

 System.out.println("id : "+node.findValues("id").get(0).asText());

das war auch der Trick.

6
MAHI

Ihre Klasse product benötigt einen parameterlosen Konstruktor. Sie können es privat machen, aber Jackson braucht den Konstruktor.

Als Randnotiz: Sie sollten Pascal als Schreibweise für Ihre Klassennamen verwenden. Das ist Product und nicht product.

2
Esteban Araya