2016-11-19 4 views
8

मुझे यह जानकर आश्चर्य हुआ कि कैसे फायरबेस सीओएसओएल को पीओजेओ ऑब्जेक्ट को जेसन से/सीरियललाइज करता है, क्या यह जैक्सन या जीसन या किसी भी इसी तरह की लाइब्रेरी का उपयोग करता है।
मुझे नामकरण सम्मेलन फ़ायरबेस के साथ परेशानी है। मेरे मॉडल इस तरह कुछ:फायरबेस सीरियलाइजेशन/deserialization के साथ नामकरण सम्मेलन?

class Data { 
    private String someFieldName; 
    private String anotherFieldName; 
    public Data() {} 
    public void setSomeFieldName(String) {...} 
    public String getSomeFieldName(String) {...} 
    public void setAnotherFieldName(String) {...} 
    public String getAnotherFieldName() {...} 
} 

और Firebase में अपेक्षित परिणाम होना चाहिए:

{ 
    "some_field_name" : "...", 
    "another_field_name" : "..." 
} 

साथ Gson मैं Gson दस्तावेज़ में के रूप में मेरे इस प्रयोजन के लिए FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES उपयोग कर सकते हैं,:

यहां "जावा फील्ड नाम" के रूप में कुछ उदाहरण दिए गए हैं ---> "JSON फ़ील्ड नाम":

  • someFieldName ---> some_field_name
  • _someFieldName ---> _some_field_name

  • aStringField ---> a_string_field

  • aURL ---> a_u_r_l

मैं अपने POJO ऑब्जेक्ट को विशिष्ट नाम के साथ "फायरबेस मूल्य" में कैसे परिवर्तित कर सकता हूं आईएनजी सम्मेलन और इसके विपरीत, या serialize/deserialize प्रक्रिया को अनुकूलित करने के लिए कोई तरीका है?

धन्यवाद!

+1

उपयोग '@SerializedName (" whateverCamelCase_or_underscore_field_name ")' –

उत्तर

13

जब डेटा Firebase डेटाबेस से वापस पढ़ने आप @PropertyName एनोटेशन एक क्षेत्र चिह्नित करने के लिए है, इसलिए की तरह उपयोग कर सकते हैं deserialized जब धारावाहिक जा रहा है का नाम बदलने की /:

@IgnoreExtraProperties 
class Data { 
    @PropertyName("some_field_name") 
    public String someFieldName 
    @PropertyName("another_field_name") 
    private String anotherFieldName; 
    public Data() {} 
} 

सुनिश्चित करें कि आपके क्षेत्र सार्वजनिक है और निजी नहीं है या अन्यथा एनोटेशन काम नहीं करेगा (मुझे यह भी विश्वास है कि फायरबेस हूड के तहत ऑब्जेक्ट मैपिंग को संभालने के लिए जैक्सन का उपयोग करता है, लेकिन ऐसा नहीं लगता कि आप इसे वास्तव में अनुकूलित कर सकते हैं इसका उपयोग कैसे करता है)।

+0

यह न GSON जैक्सन है और न ही, है न प्रलेखन लिंक @crymson है? – ericn

+0

@ericn आप सही हैं कि यह न तो है। मैं जैक्सन कहता हूं क्योंकि टिप्पणियां काफी समान दिखती हैं लेकिन मैं वास्तव में निश्चित रूप से नहीं जान सकता, हालांकि इस संदर्भ दस्तावेज़ में कुछ डेटा एक सुराग देता है https://www.firebase.com/docs/java-api/javadoc/com/firebase /client/GenericTypeIndicator.html (शीर्ष पर जैक्सन के संदर्भ को नोट करें) – crymson

+0

धन्यवाद, यह मुझे बहुत समय बचाने में मदद करता है! –

4

व्यक्तिगत रूप से मैं क्रमशः क्रमिकरण/deserialization प्रक्रिया पर स्पष्ट नियंत्रण रखना पसंद करते हैं, और विशिष्ट ढांचे और/या एनोटेशन पर निर्भर नहीं है।

अपने डेटा वर्ग बस इस तरह संशोधित किया जा सकता:

class Data { 
    private String someFieldName; 
    private String anotherFieldName; 
    public Data() {} 
    public Data(Map<String, Object> map) { 
     someFieldName = (String) map.get("some_field_name") ; 
     anotherFieldName = (String) map.get("another_field_name") ; 
    } 

    public Map<String, Object> toMap() { 
     Map<String, Object> map = new HashMap<>(); 
     map.put("some_field_name", someFieldName); 
     map.put("another_field_name", anotherFieldName); 
     return map ; 
    } 
} 

firebase के लिए मूल्य लिखने के लिए, बस कार्य करें:

dbref.setValue(data.toMap()); 

पढ़ने के लिए:

Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue(); 
data = new Data(map); 

वे कुछ कर रहे हैं इस समाधान के साथ फायदे:

  • कोई धारणा अंतर्निहित JSON ढांचे
  • एनोटेशन का उपयोग करने की आवश्यकता नहीं पर किया जाता है
  • तुम भी आगे (इसके अंतर्गत टुकड़ा) एक DataMapper तरीके toMap() और निर्माता externalizing द्वारा आप अपने Json मॉडल से मॉडल वस्तु दसगुणा कर सकते हैं

public static Data fromMap(Map<String, Object> map) { 
    String someFieldName = (String) map.get("some_field_name") ; 
    String anotherFieldName = (String) map.get("another_field_name") ; 
    return new Data(someFieldName, anotherFieldName); 
} 

public static Map<String, Object> toMap(Data data) { 
    Map<String, Object> map = new HashMap<>(); 
    map.put("some_field_name", data.getSomeFieldName()); 
    map.put("another_field_name", data.getAnotherFieldName()); 
    return map ; 
} 
+0

मैं एक वैकल्पिक दृष्टिकोण या अधिक जटिल आवश्यकताओं की सराहना कर सकता हूं, लेकिन हाथ से एनोटेशन को खारिज करना अधिक है। एनोटेशन काफी शक्तिशाली हैं और विशेष रूप से आपके समाधान में लिखे गए अतिरिक्त बॉयलरप्लेट कोडिंग से बचने के लिए डिज़ाइन किए गए थे। @PropertyName ("your_name") आपको मैपिंग को पढ़ने और लिखने दोनों देता है और अधिकांश मामलों में आसानी से रखरखाव योग्य होता है। – giulio

+0

@giulio मैं आपके साथ सहमत हूं ... एनोटेशन का उपयोग करने की कोई ज़रूरत नहीं है एक वास्तविक लाभ नहीं है। अगर वे एनोटेशन थे कि फ्रेमवर्क-स्वतंत्र (जैक्सन से बंधे नहीं) और जैक्सन या फायरबेस द्वारा मान्यता प्राप्त, मैं उनका उपयोग करूंगा। – Benoit

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