2013-02-15 76 views
22

這裏是我的Java代碼是用於反序列化, 我想將json字符串轉換爲java對象。在這方面,我使用了下面的代碼:傑克遜反序列化JSON到Java對象

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

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

我收到以下錯誤。

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) 

幫我解決這個問題,

回答

29

它看起來像你試圖從實際上描述一個數組的JSON中讀取一個對象。 Java對象被映射到帶花括號的JSON對象{},但是您的JSON實際上以方括號[]開頭,指定一個數組。

實際上你有什麼是List<product>要描述泛型類型,由於Java的類型擦除,您必須使用TypeReference。您的反序列化可能爲:myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

其他一些注意事項:您的類應始終爲CamelCased。您的主要方法可以是public static void main(String[] args) throws Exception,它可以爲您節省所有無用的catch塊。

2

product類需要一個參數的構造函數。你可以把它變成私人的,但傑克遜需要這個構造函數。

作爲一個方面說明:你應該使用Pascal封套來處理你的類名。那是Product,而不是product

+0

@ Esteban Araya我已經嘗試過,但同樣的錯誤發生 – MAHI 2013-02-15 08:01:32

11

你要行

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

改變

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

因爲你是反序列化陣列(順便說一句:正如前面提到的,你應該用大寫字母開頭的類名)。此外,您必須爲您的字段創建setter方法或將其標記爲公開才能完成此工作。

編輯:您還可以去與史蒂芬Schlansker的建議,並使用

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

,而是如果你想避免陣列。

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

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

這也做了伎倆。