2011-08-12 14 views
24

मेरे पास एक प्रश्न है जो स्टैक ओवरफ्लो पर कुछ प्रश्नों के समान है लेकिन कोई भी वास्तव में मेरी समस्या का उत्तर नहीं देता है। मैं जैक्सन के ObjectMapper का उपयोग करें और उपयोगकर्ता वस्तुओं का एक सूची में इस JSON स्ट्रिंग पार्स करने के लिए करना चाहते हैं:जैक्सन जेएसओएन + जावा जेनेरिक लिंकड हैशैप

[{ "user" : "Tom", "role" : "READER" }, 
{ "user" : "Agnes", "role" : "MEMBER" }] 

मैं इस तरह एक आंतरिक वर्ग को परिभाषित:

public class UserRole { 

    private String user 
    private String role; 

    public void setUser(String user) { 
     this.user = user; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    public String getUser() { 
     return user; 
    } 

    public String getRole() { 
     return role; 
    } 
} 

एक सूची के लिए JSON स्ट्रिंग पार्स करने

protected <T> List<T> mapJsonToObjectList(String json) throws Exception { 
    List<T> list; 
    try { 
     list = mapper.readValue(json, new TypeReference<List<T>>() {}); 
    } catch (Exception e) { 
     throw new Exception("was not able to parse json"); 
    } 
    return list; 
} 

लेकिन क्या मैं वापस पाने के LinkedHashMaps के List है: UserRoles की मैं जेनरिक का उपयोग करें।

मेरे कोड में क्या गलत है?

+1

यह जावा भाषा, और कुख्यात प्रकार विलोपन है: वहाँ में टी एक प्रकार चर रहा है और परिभाषा टाइप नहीं; और मूल रूप से इसका मतलब है कि आप सूची के लिए पूछ रहे हैं। जैक्सन फिर जेएसओएन को 'प्राकृतिक' ऑब्जेक्ट प्रकारों का उपयोग करके बांधता है, और जेएसओएन ऑब्जेक्ट तब एक मानचित्र बन जाता है (प्रकार का लिंक्ड हैशैप जो क्रमबद्ध करता है)। कक्षा उत्तीर्ण करके आपने सही ढंग से समस्या हल की है, जो वास्तविक प्रकार को परिभाषित करता है। – StaxMan

उत्तर

30

निम्नलिखित कार्य और StaxMan की सलाह के अनुसार अब बहिष्कृत स्थिर collectionType() विधि का उपयोग नहीं करता है।

public class SoApp 
{ 

    /** 
    * @param args 
    * @throws Exception 
    */ 
    public static void main(String[] args) throws Exception 
    { 
     System.out.println("Hello World!"); 

     String s = "[{\"user\":\"TestCity\",\"role\":\"TestCountry\"},{\"user\":\"TestCity\",\"role\":\"TestCountry\"}]"; 
     StringReader sr = new StringReader("{\"user\":\"TestCity\",\"role\":\"TestCountry\"}"); 
     //UserRole user = mapper.readValue(sr, UserRole.class); 

     mapJsonToObjectList(new UserRole(),s,UserRole.class); 

    } 

    protected static <T> List<T> mapJsonToObjectList(T typeDef,String json,Class clazz) throws Exception 
    { 
     List<T> list; 
     ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(json); 
     TypeFactory t = TypeFactory.defaultInstance(); 
     list = mapper.readValue(json, t.constructCollectionType(ArrayList.class,clazz)); 

     System.out.println(list); 
     System.out.println(list.get(0).getClass()); 
     return list; 
    } 
} 

...

public class UserRole{ 

    private String user; 
    private String role; 

    public void setUser(String user) { 
     this.user = user; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    public String getUser() { 
     return user; 
    } 

    public String getRole() { 
     return role; 
    } 

    @Override 
    public String toString() 
    { 
     return "UserRole [user=" + user + ", role=" + role + "]"; 
    } 

} 

उत्पादन ...

Hello World! 
[{"user":"TestCity","role":"TestCountry"},{"user":"TestCity","role":"TestCountry"}] 
[UserRole [user=TestCity, role=TestCountry], UserRole [user=TestCity, role=TestCountry]] 
class com.test.so.fix.UserRole 
+2

सही। एक मामूली नोट यह है कि आस-पास के मुद्दे को दूर करने के लिए, आप 'statMapper.getTypeFactory()' को गैर स्थैतिक तरीकों का उपयोग करने के लिए कॉल कर सकते हैं; जैक्सन 1.8 में यह परिवर्तन (टाइपफैक्ट्री इंस्टेंस का उपयोग करने के लिए) को स्कैला जैसे जेवीएम भाषाओं का समर्थन करने के लिए जरूरी था, जिसमें अपना स्वयं का संग्रह/मानचित्र प्रकार है ... – StaxMan

+0

@StaxMan - धन्यवाद गैर-बहिष्कृत विधि – nsfyn55

+1

@ nsfyn55 शामिल करने के लिए अपडेट किया गया है, आपके उत्तर में दो मुख्य शामिल हैं उस तरह के प्रश्नों के अंक। 'टी' का उपयोग करना और इसे गैर बहिष्कृत तरीकों से संभालना। वोटिंग – kamaci

संबंधित मुद्दे