2012-06-19 3 views
5

आईडी क्लास ऑब्जेक्ट को जेएसओएन के रूप में प्रस्तुत करना पसंद है। उदाहरण के लिए, अगर मैं वर्ग defintions है इस प्रकार है:जावा क्लास का JSON प्रतिनिधित्व कैसे करें?

public class MyClass { 
    String myName; 
    int myAge; 
    MyOtherClass other; 
} 

public class MyOtherClass { 
    double myDouble; 
} 

मैं प्रकार MyClass के एक वर्ग वस्तु से निम्नलिखित नेस्टेड JSON प्राप्त करना चाहते हैं:

{ 
    myName: String, 
    myAge: int, 
    other: { 
     myDouble: double; 
    } 
} 

संपादित करें:

मैं इन वर्गों के उदाहरणों को क्रमबद्ध नहीं करना चाहता, मैं समझता हूं कि जीएसओएन के साथ ऐसा कैसे करें। मैं कक्षा की संरचना को क्रमबद्ध करना चाहता हूं, ताकि एक स्वामित्व वर्ग ऑब्जेक्ट I को जेएसओएन उत्पन्न हो सके जो कक्षा के क्षेत्रों को स्ट्रिंग, डबल इत्यादि जैसे मानक वस्तुओं में दोहराता है

उत्तर

1

मैं जैक्सन का उपयोग करने की सलाह दूंगा। आप जैक्सन के आधार पर JSONObjectSerializer क्लास को भी देख सकते हैं जो oVirt पर इंजन/बैकएंड/मैनेजर/मॉड्यूल/यूटिल्स के तहत पाया जा सकता है (आप कोड क्लोन कर सकते हैं) और देखें कि हमने जैक्सन का उपयोग कैसे किया।

+0

इन सभी के साथ मुद्दा यह है कि मुझे फ़ील्ड प्रकार नहीं मिल सकता है, जो मेरे लिए सबसे महत्वपूर्ण हिस्सा है। –

+1

@hatboysam - जैक्सन चलो आप क्षेत्र के प्रकारों को क्रमबद्ध/deserialize भी करते हैं। Www.ovirt.org पर किए गए काम को देखें (कोड प्राप्त करें, इंजन/बैकएंड/प्रबंधक/मॉड्यूल/यूटिल पर देखें - आपको जेएसओएन क्रमबद्ध करने और deserializing के लिए लिखा कुछ कोड देखेंगे)। –

3

Jettison के साथ, आप कर सकते हैं जावा से JSON तक अपने स्वयं के मैपिंग रोल करें। तो इस मामले में, आप अपनी इच्छित कक्षा के क्लास ऑब्जेक्ट को प्राप्त कर सकते हैं, फिर जेटिसन का उपयोग कर जेएसओएन को GetFields, getConstructors, getMethods आदि विधियों द्वारा लौटाए गए मानचित्र को मैप करें।

0

वही काम करना चाहते हैं, अंत में मैंने अपनी विधि लिखना घायल कर दिया, यह सभी मामलों को संभाल नहीं करता है। यदि घोषित क्षेत्रों में से एक एक मानचित्र इस टूट जाएगा है, लेकिन इस सबसे आम वस्तुओं के लिए ठीक हो रहा है:

@Override 
public Map reflectModelAsMap(Class classType) { 
    List<Class> mappedTracker = new LinkedList<Class>(); 

    return reflectModelAsMap(classType, mappedTracker); 
} 

private Map reflectModelAsMap(Class classType, List mappedTracker) { 
    Map<String, Object> mapModel = new LinkedHashMap<String, Object>(); 

    mappedTracker.add(classType); 

    Field[] fields = classType.getDeclaredFields(); 

    for (Field field : fields) { 
     if (mappedTracker.contains(field.getType())) 
      continue; 

     if (BeanUtils.isSimpleValueType(field.getType())) { 
      mapModel.put(field.getName(), field.getType().toString()); 
     } else if (Collection.class.isAssignableFrom(field.getType())) { 
      Class actualType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; 
      mapModel.put("Collection", reflectModelAsMap(actualType, mappedTracker)); 
     } else { 
      mapModel.put(field.getName(), reflectModelAsMap(field.getType(), mappedTracker)); 
     } 
    } 

    return mapModel; 
} 

क्योंकि मैं कैसे हाइबरनेट में रिश्तों को संभालने की वहाँ मैप की नजर; इसके बिना माता-पिता और बच्चे के बीच एक अंतहीन पुनरावर्ती संबंध है। child.getFather().getFirstChild().getFather().getFirstChild().getFather()...