2013-08-25 3 views
7

द्वारा जीएसओएन नियंत्रण क्रमबद्धता स्वरूपण मैं एनोटेशन का उपयोग करके क्रमबद्धता प्रारूप को नियंत्रित करने की कोशिश कर रहा हूं। लेकिन टाइपएडाप्टर या TypeAdapterFactory के अंदर से फील्ड एनोटेशन तक पहुंचने का कोई तरीका नहीं प्रतीत होता है।एनएसओशन

यहां एक उदाहरण है जो मैं प्राप्त करने की कोशिश कर रहा हूं।

import org.joda.time.DateTime; 

public class Movie { 
    String title; 

    @DateTimeFormat("E, M d yyyy") 
    DateTime releaseDate; 
    // other fields ... 
} 

public class LogEvent { 
    String message; 

    @DateTimeFormat("yyyyMMdd'T'HHmmss.SSSZ") 
    DateTime timestamp; 
} 

मूवी वस्तु के लिए, मैं के रूप में "शनिवार, 24 अगस्त 2013" तारीख को क्रमानुसार करने चाहते हैं, लेकिन LogEvent के लिए, "20130824T103025.123Z"।

मैं अलग प्रत्येक वर्ग (कल्पना कीजिए अगर हम 100 विभिन्न कि विभिन्न स्वरूपों की आवश्यकता होती है उन्हें में datetime क्षेत्रों के साथ वर्ग है)

TIA के लिए TypeAdapterFactory के लिखने के बिना यह करने के लिए कोशिश कर रहा हूँ!

उत्तर

1

यहां एक तरीका है। विचार है कि आप अपनी कक्षाओं को लोड करने के लिए TypeAdapterFactory का उपयोग करें। फिर किसी ऑब्जेक्ट को लोड करने के बाद, एनोटेशन लागू करने और मान को प्रतिस्थापित करने के लिए DateTime के प्रकार का पता लगाएं।

यह नहीं पता कि DateTime ऑब्जेक्ट कैसे संग्रहीत किया जाएगा, इसलिए शायद आपको getAsJsonPrimitive के बजाय getAsJsonObject का उपयोग करना होगा।

final class MyAdapter implements TypeAdapterFactory { 
    @Override 
    public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> tokenType) { 
    final TypeAdapter<T> adapter = gson.getDelegateAdapter(this, tokenType); 

    return new TypeAdapter<T>() { 
     @Override 
     public T read(JsonReader reader) throws IOException { 
     JsonElement tree = gson.getAdapter(JsonElement.class).read(reader); 
     T out = adapter.fromJsonTree(tree); 

     // important stuff here 
     Class<? super T> cls = tokenType.getRawType(); 
     for (Field field : cls.getDeclaredFields()) { 
      if (DateTime.class.isAssignableFrom(field.getType())) { 
      DateTimeFormat ano = field.getAnnotation(DateTimeFormat.class); 
      if (ano != null) { 
       JsonPrimitive val = ((JsonObject) tree).getAsJsonPrimitive(field.getName()); 
       String format = ano.value(); 

       DateTime date = // .. do your format here 
       field.set(out, date); 
      } 
      } 
     } 

     return out; 
     } 

     @Override 
     public void write(JsonWriter writer, T value) throws IOException { 
     } 
    }; 
    } 
} 
+0

इस सवाल में, मैं क्या से बचने के लिए प्रत्येक वर्ग कि दिनांक समय फ़ील्ड में सिर्फ इसलिए कि मैं प्रत्येक वर्ग में अलग ढंग से क्षेत्र स्वरूपित करना चाहते हैं के लिए कस्टम एडाप्टर बनाने के लिए हो रही है कोशिश कर रहा हूँ। लेकिन हो सकता है कि यह ReflectiveTypeAdapterFactory को पुन: कार्यान्वित किए बिना संभव नहीं है। – hendysg

+0

यह एक 'टाइपएडाप्टर फैक्टरी' है, एक विशिष्ट एडाप्टर नहीं, इस प्रकार यह प्रत्येक वर्ग के लिए काम करना चाहिए। कोशिश करो। – PomPom

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

  • कोई संबंधित समस्या नहीं^_^