2013-05-07 10 views
79

पर कनवर्ट करें मैं जैक्सन को देख रहा हूं, लेकिन ऐसा लगता है कि मुझे मानचित्र को JSON में परिवर्तित करना होगा, और उसके परिणामस्वरूप JSON को पीओजेओ में बदलना होगा।एक मानचित्र <स्ट्रिंग, स्ट्रिंग> को एक POJO

क्या मानचित्र को सीधे पीओजेओ में परिवर्तित करने का कोई तरीका है?

उत्तर

160

ठीक है, आप जैक्सन के साथ भी इसे प्राप्त कर सकते हैं। (और यह अधिक आरामदायक लगता है क्योंकि आप जैक्सन का उपयोग करने पर विचार कर रहे थे)।

उपयोग ObjectMapper के convertValue विधि:

final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper 
final MyPojo pojo = mapper.convertValue(map, MyPojo.class); 

JSON स्ट्रिंग या कुछ और में परिवर्तित करने की आवश्यकता नहीं है; प्रत्यक्ष रूपांतरण बहुत तेज़ करता है।

+0

क्या आप इस पुस्तकालय के लिए ग्रेडल कमांड प्रदान कर सकते हैं? –

+2

आपको ऑब्जेक्टमैपर 'compile' com.fasterxml.jackson.core का उपयोग करने के लिए इस लाइब्रेरी को शामिल करने की आवश्यकता है: जैक्सन-डाटाबेस: 2.7.3'' –

+1

कन्वर्ट का उपयोग करना वैल्यू सही उत्तर है, लेकिन हर बार ऑब्जेक्टमैपर उदाहरण न बनाएं। इसे बनाना और थ्रेड-सुरक्षित बनाना महंगा है, इसलिए इसे बनाएं और इसे कहीं कैश करें। – glade

2

हां, जेएसओएन के मध्यवर्ती रूपांतरण से बचने के लिए यह निश्चित रूप से संभव है। Dozer जैसे गहरे प्रतिलिपि टूल का उपयोग करके आप मानचित्र को सीधे पीओजेओ में बदल सकते हैं। यहाँ एक साधारण उदाहरण है:

उदाहरण POJO:

public class MyPojo implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private String id; 
    private String name; 
    private Integer age; 
    private Double savings; 

    public MyPojo() { 
     super(); 
    } 

    // Getters/setters 

    @Override 
    public String toString() { 
     return String.format(
       "MyPojo[id = %s, name = %s, age = %s, savings = %s]", getId(), 
       getName(), getAge(), getSavings()); 
    } 
} 

नमूना रूपांतरण कोड:

public class CopyTest { 
    @Test 
    public void testCopyMapToPOJO() throws Exception { 
     final Map<String, String> map = new HashMap<String, String>(4); 
     map.put("id", "5"); 
     map.put("name", "Bob"); 
     map.put("age", "23"); 
     map.put("savings", "2500.39"); 
     map.put("extra", "foo"); 

     final DozerBeanMapper mapper = new DozerBeanMapper(); 
     final MyPojo pojo = mapper.map(map, MyPojo.class); 
     System.out.println(pojo); 
    } 
} 

आउटपुट:

MyPojo [id = 5, नाम = बॉब, उम्र = 23, बचत = 2500.3 9]

नोट: यदि आप अपना स्रोत मानचित्र Map<String, Object> पर बदलते हैं तो आप मनमाने ढंग से गहरी घोंसले वाली संपत्तियों पर प्रतिलिपि बना सकते हैं (Map<String, String> के साथ आपको केवल एक स्तर मिलता है)।

+0

धन्यवाद - बहुत उपयोगी। – user86834

+1

आप मानचित्र से POJO तक "गहरी प्रति" कैसे कर सकते हैं? उदाहरण के लिए कहें कि आपके पास User.class है जो पता.class को समाहित करता है और मानचित्र में "address.city", "address.zip" जैसी कुंजी होती है और इन्हें उपयोगकर्ता को मानचित्र करने की आवश्यकता होती है। एड्रेस.सिटी और उपयोगकर्ता। एड्रेस.जिप ? ऐसा लगता है कि ऑब्जेक्ट ग्राफ़ के उप-स्तर के रूप में मानचित्र कुंजी में डॉट को स्वचालित रूप से व्याख्या नहीं करता है। – szxnyc

20

Gson के साथ एक समाधान:

Gson gson = new Gson(); 
JsonElement jsonElement = gson.toJsonTree(map); 
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class); 
+1

के साथ कुछ भी नहीं करना बहुत बढ़िया !!!!!!!! – TechBee

3

मैं दोनों जैक्सन और BeanUtils परीक्षण किया और पता चला कि BeanUtils तेज हो गया है है।
मेरी मशीन (विंडोज 8.1, जेडीके 1.7) में मुझे यह परिणाम मिला।

BeanUtils t2-t1 = 286 
Jackson t2-t1 = 2203 


public class MainMapToPOJO { 

public static final int LOOP_MAX_COUNT = 1000; 

public static void main(String[] args) { 
    Map<String, Object> map = new HashMap<>(); 
    map.put("success", true); 
    map.put("data", "testString"); 

    runBeanUtilsPopulate(map); 

    runJacksonMapper(map); 
} 

private static void runBeanUtilsPopulate(Map<String, Object> map) { 
    long t1 = System.currentTimeMillis(); 
    for (int i = 0; i < LOOP_MAX_COUNT; i++) { 
     try { 
      TestClass bean = new TestClass(); 
      BeanUtils.populate(bean, map); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
    } 
    long t2 = System.currentTimeMillis(); 
    System.out.println("BeanUtils t2-t1 = " + String.valueOf(t2 - t1)); 
} 

private static void runJacksonMapper(Map<String, Object> map) { 
    long t1 = System.currentTimeMillis(); 
    for (int i = 0; i < LOOP_MAX_COUNT; i++) { 
     ObjectMapper mapper = new ObjectMapper(); 
     TestClass testClass = mapper.convertValue(map, TestClass.class); 
    } 
    long t2 = System.currentTimeMillis(); 
    System.out.println("Jackson t2-t1 = " + String.valueOf(t2 - t1)); 
}} 
+0

अंतर यह है कि जैक्सन के साथ एक संपूर्ण प्रकार का रूपांतरण ढांचा है। जैसे 'मानचित्र' में 'map.put ("डेटा", "2016-06-26") है और 'टेस्टक्लास' में फ़ील्ड' निजी लोकलडेट डेटा है; ', तो जैक्सन चीजें करने में सक्षम होंगे, जबकि बीनयूल्ट्स असफल। –

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