2013-02-15 22 views
22

Ecco il mio codice Java che viene utilizzato per la de-serializzazione, sto cercando di convertire la stringa json in oggetto java. In tal modo ho usato il seguente codice:dessonializzazione di jackson json a java-objects

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

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

sto ottenendo il seguente errore.

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) 

aiutarmi a risolvere questo,

risposta

29

Sembra che si stia tentando di leggere un oggetto da JSON che descrive effettivamente un array. Gli oggetti Java sono mappati su oggetti JSON con parentesi graffe {} ma il JSON inizia effettivamente con parentesi quadre [] che designano una matrice.

Quello che si ha effettivamente è un List<product> Per descrivere i tipi generici, a causa della cancellazione del tipo di Java, è necessario utilizzare un TypeReference. La tua deserializzazione potrebbe leggere: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

Un paio di altre note: le tue classi dovrebbero sempre essere CamelCased. Il tuo metodo principale può essere solo public static void main(String[] args) throws Exception che ti salva tutti gli inutili blocchi catch.

2

La classe product ha bisogno di un costruttore senza parametri. Puoi renderlo privato, ma Jackson ha bisogno del costruttore.

Come nota a margine: è necessario utilizzare il rivestimento Pascal per i nomi delle classi. Questo è Product e non product.

+0

@ Esteban Araya ho provato questo stesso errore si verifica – MAHI

11

si deve cambiare la linea

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

a

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

poiché state deserializzazione di un array (btw: si dovrebbe iniziare i nomi di classe con le lettere maiuscole come accennato in precedenza). Inoltre devi creare metodi di setter per i tuoi campi o contrassegnarli come pubblici per far funzionare questo.

Edit: Si può anche andare con il suggerimento di Steven Schlansker e utilizzare

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

invece se si vuole evitare gli array.

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

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

anche questo ha fatto il trucco.