2013-02-15 82 views
22

यहां मेरा जावा कोड है जिसका उपयोग डी-सीरियलाइजेशन, के लिए किया जाता है, मैं जेसन स्ट्रिंग को जावा ऑब्जेक्ट में कनवर्ट करने की कोशिश कर रहा हूं।जैक्सन deserialization जेसन से जावा-ऑब्जेक्ट्स

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 से ऑब्जेक्ट को पढ़ने की कोशिश कर रहे हैं जो वास्तव में एक सरणी का वर्णन करता है। जावा ऑब्जेक्ट्स को घुंघराले ब्रेसिज़ {} के साथ जेएसओएन ऑब्जेक्ट्स में मैप किया गया है लेकिन आपका JSON वास्तव में स्क्वायर ब्रैकेट [] से सरणी के साथ शुरू होता है।

आपके पास वास्तव में क्या है List<product> सामान्य प्रकारों का वर्णन करने के लिए, जावा के प्रकार के मिटाए जाने के कारण, आपको TypeReference का उपयोग करना होगा। आपका deserialization पढ़ सकता है: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

कुछ अन्य नोट्स: आपकी कक्षाएं हमेशा CamelCased होना चाहिए। आपकी मुख्य विधि केवल public static void main(String[] args) throws Exception हो सकती है जो आपको सभी बेकार catch ब्लॉक बचाती है।

2

आपका product वर्ग एक parameterless निर्माता की जरूरत है। आप इसे निजी बना सकते हैं, लेकिन जैक्सन को कन्स्ट्रक्टर की आवश्यकता है।

एक साइड नोट के रूप में: आपको अपने वर्ग के नामों के लिए पास्कल आवरण का उपयोग करना चाहिए। वह Product है, और product नहीं है।

+0

@ एस्टेबान अरया मैंने कोशिश की है कि अभी तक एक ही त्रुटि होती है – MAHI

11

चूंकि आप एक सरणी deserializing रहे

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

करने के लिए लाइन

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

बदलना होगा (Btw: यदि आप पहले उल्लेख किया है के रूप में अपर केस पत्र के साथ अपने वर्ग के नाम शुरू कर देना चाहिए)। इसके अतिरिक्त आपको अपने काम के लिए सेटटर विधियां बनाना होगा या इस काम को करने के लिए उन्हें सार्वजनिक रूप से चिह्नित करना होगा।

संपादित करें: आप भी स्टीवन 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()); 

इसने यह चाल भी की।