2013-09-06 7 views
5

के साथ जावा पीओजेओ कक्षा में जेएसओएन डेटा मैपिंग मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं और मैं जैक्सन की स्ट्रीम क्षमताओं का उपयोग करके कुछ जावा डेटा की प्रसंस्करण को कार्यान्वित करने की कोशिश कर रहा हूं। ऐसा करने के लिए मेरे पास चलाने के लिए कुछ कोड उदाहरण हैं और मैं बताऊंगा कि प्रत्येक क्या करता है।जैक्सन मैपर

{ 
"users": [ 
    { 
     "ID": "26", 
     "data1": "Momonth", 
     "data2": "2011-10-30 04:34:53" 
    }, 
    { 
     "ID": "45", 
     "data1": "Porto", 
     "data2": "2011-10-18 05:34:00" 
    }, 
    { 
     "ID": "21", 
     "data1": "Tomson", 
     "data2": "2011-10-12 02:44:13" 
    } 
], 
"success": 1, 
} 

नीचे कोड POJO जहां इस डेटा संग्रहीत किया जाएगा के रूप में यह "उन" मेरे डेटा में सरणी सूची वस्तुओं में से प्रत्येक के माध्यम से iterates है::

यहाँ JSON के साथ मैं काम कर रहा हूँ है

@JsonRootName(value = "users") 
public class User { 

    String ID; 
    String data1; 
    String data2; 
    ... 

    public String getID() { 
     return ID; 
    } 
    public void setID(String iD) { 
     ID = iD; 
    } 
    public String getData1() { 
     return data1; 
    } 
    public void setData1(String data1) { 
     this.data1 = data1; 
    } 
    public String getData2() { 
     return data2; 
    } 
    public void setData2(String data2) { 
     this.data2 = data2; 
    } 
    ... 

} 

अब कोड के नीचे मैं JSON डेटा को देखें और फिर वस्तुओं की "उन" सरणी सूची हड़पने, मैं तो अब के लिए बस की समीक्षा करने के कि LogCat करने के लिए प्रत्येक उपयोगकर्ता का नाम मुद्रित करने के लिए करना चाहता था की उम्मीद करेंगे यह काम करता है और जैसा कि पहले बताया गया है, मैं डेटा के रूप में विधि का उपयोग करना चाहता हूं काफी बड़ा और मैं स्मृति मुद्दों से बचना चाहता हूं।

HttpRequest request = HttpRequest.get("http://www.site.com/android/app/getAllUsers.php"); 
final Reader reader = request.reader(); 
final ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
final JsonFactory factory = mapper.getFactory(); 

try { 

    JsonParser jp = factory.createParser(reader); 

    while(jp.nextToken() == JsonToken.START_OBJECT) { 

     String fieldName = jp.getCurrentName(); 

     jp.nextToken(); 

     final User a = mapper.readValue(jp.getText(), User.class); 

    } 
} catch (JsonParseException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

हालांकि कोड ऊपर अपनी वर्तमान स्थिति में काम नहीं करता है और मैं जैक्सन से निम्न त्रुटियों मिलती है:

09-06 11:11:25.326: W/System.err(15029): com.fasterxml.jackson.databind.JsonMappingException: Current token not START_OBJECT (needed to unwrap root name 'users'), but FIELD_NAME 
09-06 11:11:25.326: W/System.err(15029): at [Source: [email protected]; line: 1, column: 2] 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper._unwrapAndDeserialize(ObjectMapper.java:2948) 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2858) 
09-06 11:11:25.326: W/System.err(15029): at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1569) 
09-06 11:11:25.326: W/System.err(15029): at com.app.tool.UsersListActivity$LoadAllUsers.doInBackground(UsersListActivity.java:381) 
09-06 11:11:25.326: W/System.err(15029): at com.app.tool.UsersListActivity$LoadAllUsers.doInBackground(UsersListActivity.java:1) 
09-06 11:11:25.326: W/System.err(15029): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
09-06 11:11:25.326: W/System.err(15029): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
09-06 11:11:25.326: W/System.err(15029): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
09-06 11:11:25.326: W/System.err(15029): at java.lang.Thread.run(Thread.java:856) 

मैं वास्तव में किसी भी मदद के रूप में मैं कर रहा हूँ इस पर दिया जा सकता है की सराहना करेंगे फंस गया और आगे नहीं जा सकता।

अग्रिम धन्यवाद


** * ***संपादित* ** * ** * *


उत्तर के लिए धन्यवाद और मैं कोड लागू करने के लिए कोशिश की है लेकिन यह अभी भी काम करने के लिए नहीं लगता है, कोड मैं अब नीचे है:

protected String doInBackground(String... args) { 

    HttpRequest request = HttpRequest.get("http://www.site.com/android/app/getAllUsers.php"); 
    final Reader reader = request.reader(); 

    final ObjectMapper mapper = new ObjectMapper(); 
    final JsonFactory factory = mapper.getFactory(); 

    try { 

      JsonParser jp = factory.createParser(reader); 

      JsonNode root = mapper.readTree(jp); 
      ArrayNode users = (ArrayNode) root.path("users"); 

      Iterator<JsonNode> iterator = users.elements(); 

      while (iterator.hasNext()) { 
       User user = mapper.readValue(iterator.next(), User.class); 

       System.out.println("User Name = " + user.data1); 
      } 

     } catch (JsonParseException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     return null; 
} 

आप इसे से कोई लेना देना नहीं है लगता है कि मेरी एक ASYNC कार्य में चल रही प्रक्रिया या मैं एक वेब सेवा के माध्यम से अपने JSON तक पहुंच रहा हूँ?

त्रुटि पंक्ति::

User user = mapper.readValue(iterator.next(), User.class); 

त्रुटि कोड: त्रुटि मैं नीचे लाइन है कि उस पर से पता चलता है के साथ

The method readValue(JsonParser, Class<T>) in the type ObjectMapper is not applicable for the arguments (JsonNode, Class<User>) 

उम्मीद है कि आप मुझे इस आखिरी मुद्दा सुलझा मदद कर सकते हैं, सहायता के लिए फिर से धन्यवाद।

उत्तर

1

आपको @JsonRootName एनोटेशन की आवश्यकता नहीं है। आप बस पेड़ पढ़ सकते हैं और उपयोगकर्ता सरणी प्राप्त कर सकते हैं। फिर प्रत्येक नोड पर ObjectMapper के readValue(JsonNode node, Class<T> class) का उपयोग करें और उपयोग करें।

ध्यान दें कि आपके जेसन में पूंजीकृत आईडी को पार्सर को संकेत मिलता है, इसलिए @JsonProperty(value="ID") गेटटर पर एनोटेशन।

public class JacksonJSON { 

    public static void main(String[] args) throws Exception { 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode root = mapper.readTree(JacksonJSON.class.getResourceAsStream("/users.json")); 
     ArrayNode users = (ArrayNode) root.path("users"); 

     Iterator<JsonNode> iterator = users.getElements(); 
     while (iterator.hasNext()) { 
      User user = mapper.readValue(iterator.next(), User.class); 

      System.out.println("User id=" + user.id + " data1=" + user.data1 + " data2=" + user.data2); 
     } 


    } 

} 


class User { 

    String id; 
    String data1; 
    String data2; 

    @JsonProperty(value="ID") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getData1() { 
     return data1; 
    } 

    public void setData1(String data1) { 
     this.data1 = data1; 
    } 

    public String getData2() { 
     return data2; 
    } 

    public void setData2(String data2) { 
     this.data2 = data2; 
    } 

} 
+0

लाइन जो मैंने इटरेटर इटरेटर = users.getElements() में डाली है; मुझे निम्न त्रुटि मिलती है: विधि getElements() को ArrayNode – user723858

+0

प्रकार के लिए अपरिभाषित किया गया है, मैंने आपके सुझाव को लागू करने के विवरण के साथ अपना प्रश्न अपडेट किया है, कोई सहायता बहुत अच्छी होगी। धन्यवाद – user723858

+0

@ user723858 - जैकसन का आप किस संस्करण का उपयोग कर रहे हैं? मैंने 1.9.9 – Qwerky