दिलचस्प पोस्ट
LINQ के साथ <सूची> सूची से सबसे निकटतम संख्या कैसे प्राप्त करें? मिनटों में दो Joda-Time DateTimes के बीच अंतर कैसे प्राप्त करें मैं PHP में एक निर्देशिका और इसकी संपूर्ण सामग्री (फाइल + उप-डायरों) को लगातार कैसे हटाऊं? रेगेक्स को गठजोड़ करें IPhone पर रीयल-टाइम पिच स्थानांतरण सीमा के किनारे पर लिंक के साथ एक चक्र कैसे बनाएं सी # के साथ MySQL के लिए पैरामीटेड क्वेरी मैं उपयोगकर्ता को प्रतिबद्ध- msg हुक के भीतर कैसे संकेतित कर सकता हूं? बाश में हत्या के बाद समाप्त संदेश को दबाने के लिए कैसे? छवि को पुनः लोड किए बिना जावास्क्रिप्ट से एनिमेटेड जीआईआई को पुनरारंभ करें कैसे एक संपत्ति को सुरक्षित और सी # में आंतरिक बनाने के लिए? रेज़र: @ एचटीएमएल.पार्टीअल () बनाम @रेन्डरपेज () अगर मैं आईबीओटलेट नहीं रखता तो क्या होगा? जावा में वाइल्डकार्ड के साथ मौजूद फाइल की जांच कैसे करें? जावा में सापेक्ष पथ के साथ खुले संसाधन

जब मैं जेसनॉन को फ़ायरबेज से जावा ऑब्जेक्ट में बदल देता हूं, तो मुझे "टाइप करने के लिए बाउंस करने में असफल" क्यों मिलता है?

[प्रकटन: मैं फ़ायरबेज में एक इंजीनियर हूँ I यह प्रश्न एक संदर्भ में कई प्रश्नों का उत्तर देने के लिए एक संदर्भ प्रश्न है।]

मेरे Firebase डेटाबेस में मेरे पास निम्न JSON संरचना है:

{ "users": { "-Jx5vuRqItEF-7kAgVWy": { "handle": "puf", "name": "Frank van Puffelen", "soId": 209103 }, "-Jx5w3IOHD2kRFFgkMbh": { "handle": "kato", "name": "Kato Wulf", "soId": 394010 }, "-Jx5x1VWs08Zc5S-0U4p": { "handle": "mimming", "name": "Jenny Tong", "soId": 839465 } } } 

मैं इसे निम्नलिखित कोड से पढ़ रहा हूं:

 private static class User { String handle; String name; public String getHandle() { return handle; } public String getName() { return name; } } Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/32108969/users"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot usersSnapshot) { for (DataSnapshot userSnapshot : usersSnapshot.getChildren()) { User user = userSnapshot.getValue(User.class); System.out.println(user.toString()); } } @Override public void onCancelled(FirebaseError firebaseError) { } }); 

लेकिन मुझे यह त्रुटि मिलती है:

धागा "FirebaseEventTarget" com.firebase.client.FirebaseException में अपवाद: टाइप करने के लिए बाउंस करने में विफल

मैं अपने उपयोगकर्ताओं को जावा ऑब्जेक्ट्स में कैसे पढ़ सकता हूं?

Solutions Collecting From Web of "जब मैं जेसनॉन को फ़ायरबेज से जावा ऑब्जेक्ट में बदल देता हूं, तो मुझे "टाइप करने के लिए बाउंस करने में असफल" क्यों मिलता है?"

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

इस उत्तर के बाकी हिस्सों में, हम जैकसन के साथ फ़ायरबेज का उपयोग करने के कुछ सामान्य तरीके दिखाएंगे।

पूर्ण उपयोगकर्ता लोड हो रहे हैं

Firebase से उपयोगकर्ताओं को एंड्रॉइड में लोड करने का सबसे आसान तरीका यह है कि अगर हम एक जावा क्लास बनाते हैं जो पूरी तरह से JSON में गुणों की नकल करता है:

 private static class User { String handle; String name; long stackId; public String getHandle() { return handle; } public String getName() { return name; } public long getStackId() { return stackId; } @Override public String toString() { return "User{handle='"+handle+“', name='"+name+"', stackId="+stackId+"\'}”; } } 

हम एक श्रोता में इस वर्ग का उपयोग कर सकते हैं:

 Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/32108969/users"); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot usersSnapshot) { for (DataSnapshot userSnapshot : usersSnapshot.getChildren()) { User user = userSnapshot.getValue(User.class); System.out.println(user.toString()); } } @Override public void onCancelled(FirebaseError firebaseError) { } }); 

आप ध्यान दें कि उपयोगकर्ता वर्ग जावाबीन प्रॉपर्टी पैटर्न का अनुसरण करता है। उपयोगकर्ता वर्ग में फ़ील्ड द्वारा हर JSON संपत्ति के नक्शे और हमारे पास प्रत्येक फ़ील्ड के लिए एक सार्वजनिक getter विधि है। यह सुनिश्चित करने से कि सभी गुणों को ठीक उसी नाम से मैप किया गया है, हम यह सुनिश्चित करते हैं कि जैक्सन उन्हें स्वचालित रूप से मैप कर सकता है।

आप अपने जावा वर्ग, और इसके खेतों और विधियों पर जैक्सन एनोटेशन डालकर मानचित्रण को मैन्युअल रूप से नियंत्रित कर सकते हैं। हम नीचे दो सबसे आम टिप्पणियों ( @JsonIgnore और @JsonIgnoreProperties ) को कवर करेंगे।

आंशिक रूप से उपयोगकर्ताओं को लोड कर रहा है

कहें कि आप केवल उपयोगकर्ता के नाम की परवाह करते हैं और अपने जावा कोड में संभालते हैं। चलो stackId हटा दें और देखें कि क्या होता है:

 private static class User { String handle; String name; public String getHandle() { return handle; } public String getName() { return name; } @Override public String toString() { return "User{handle='" + handle + “\', name='" + name + "\'}”; } } 

अगर हम अब पहले ही समान श्रोता को संलग्न करते हैं और कार्यक्रम चलाते हैं, तो यह एक अपवाद फेंक देगा:

 Exception in thread "FirebaseEventTarget" com.firebase.client.FirebaseException: Failed to bounce to type at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:187) at com.firebase.LoadPartialUsers$1.onDataChange(LoadPartialUsers.java:16) 

"प्रकार को रद्द करने में विफल" इंगित करता है कि जैक्सन एक उपयोगकर्ता ऑब्जेक्ट में JSON को डीएसरीलाइज़ करने में असमर्थ था नेस्टेड अपवाद में यह हमें बताता है कि क्यों:

 Caused by: com.shaded.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "stackId" (class com.firebase.LoadPartialUsers$User), not marked as ignorable (2 known properties: , "handle", "name"]) at [Source: java.io.StringReader@43079089; line: 1, column: 15] (through reference chain: com.firebase.User["stackId"]) at com.shaded.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) 

जैक्सन को JSON में एक संपत्ति stackId मिला और पता नहीं कि इसके साथ क्या करना है, इसलिए यह एक अपवाद फेंकता है। सौभाग्य से एक एनोटेशन है जिसका उपयोग हम अपने User वर्ग के मानचित्रण करते समय JSON से विशिष्ट गुणों को अनदेखा करने के लिए कहने के लिए कर सकते हैं:

 @JsonIgnoreProperties({ “stackId" }) private static class User { ... } 

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

जेएसएएन के गुणों को जोड़ने से फ़ायरबेज एप्लिकेशन में ऐसा एक सामान्य अभ्यास होता है, आप केवल जैक्सन को सभी गुणों को नजरअंदाज करने के लिए अधिक सुविधाजनक समझ सकते हैं, जिनके पास जावा क्लास में मैपिंग नहीं है:

 @JsonIgnoreProperties(ignoreUnknown=true) private static class User { ... } 

अब अगर हम बाद में JSON में गुण जोड़ते हैं, तो जावा कोड User को लोड करने में सक्षम होगा। बस ध्यान रखें कि उपयोगकर्ता ऑब्जेक्ट्स में सभी जानकारी शामिल नहीं होगी जो JSON में मौजूद थी, इसलिए उन्हें फिर से फायरबेज पर लिखते समय सावधान रहें।

आंशिक रूप से उपयोगकर्ताओं को बचत

एक कस्टम जावा क्लास के लिए यह अच्छा क्यों है, यह है कि हम इसके लिए सुविधा के तरीकों को जोड़ सकते हैं। मान लें कि हम उस सुविधा सुविधा को जोड़ते हैं जो उपयोगकर्ता के लिए प्रदर्शित करने के लिए नाम हो जाता है:

 private static class User { String handle; String name; public String getHandle() { return handle; } public String getName() { return name; } @JsonIgnore public String getDisplayName() { return getName() + “ (" + getHandle() + ")"; } @Override public String toString() { return "User{handle='" + handle + "\', name='" + name + "\', displayName='" + getDisplayName() + "'}"; } } 

अब हम उपयोगकर्ताओं को फायरबेज से पढ़ते हैं और उन्हें एक नए स्थान पर लिखते हैं:

 Firebase srcRef = new Firebase("https://stackoverflow.firebaseio.com/32108969/users"); final Firebase copyRef = new Firebase("https://stackoverflow.firebaseio.com/32108969/copiedusers"); srcRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot usersSnapshot) { for (DataSnapshot userSnapshot : usersSnapshot.getChildren()) { User user = userSnapshot.getValue(User.class); copyRef.child(userSnapshot.getKey()).setValue(user); } } @Override public void onCancelled(FirebaseError firebaseError) { } }); 

copiedusers नोड में JSON इस तरह दिखता है:

 "copiedusers": { "-Jx5vuRqItEF-7kAgVWy": { "displayName": "Frank van Puffelen (puf)", "handle": "puf", "name": "Frank van Puffelen" }, "-Jx5w3IOHD2kRFFgkMbh": { "displayName": "Kato Wulf (kato)", "handle": "kato", "name": "Kato Wulf" }, "-Jx5x1VWs08Zc5S-0U4p": { "displayName": "Jenny Tong (mimming)", "handle": "mimming", "name": "Jenny Tong" } } 

यह स्रोत JSON के समान नहीं है, क्योंकि जैक्सन एक getDisplayName() रूप में नए getDisplayName() पद्धति को पहचानता है और इस प्रकार JSON को एक displayName गुण getDisplayName() है जो आउटपुट करता है। हम getDisplayName() को getDisplayName() करने के लिए एक JsonIgnore एनोटेशन जोड़कर इस समस्या का समाधान करते हैं

  @JsonIgnore public String getDisplayName() { return getName() + "(" + getHandle() + ")"; } 

जब उपयोगकर्ता ऑब्जेक्ट को getDisplayName() करना होता है, तो जैक्सन अब getDisplayName() विधि को अनदेखा कर getDisplayName() और हम जो JSON लिखेंगे वह वही होगा जो हमें मिल गया।

एंड्रॉइड / जावा के लिए फायरबेज एसडीके के 9.x (और उच्च) संस्करणों ने जैकॉन को सीरियललाइजिंग / डीएसराइलाइजिंग जावा <-> JSON को भी शामिल करना बंद कर दिया। इसके बजाय नए एसडीके कस्टम एनोटेशन का न्यूनतम सेट प्रदान करता है जिससे कि सबसे सामान्य अनुकूलन जरूरतों पर नियंत्रण की अनुमति मिलती है, जबकि परिणामी जेएआर / एपीके आकार पर न्यूनतम प्रभाव पड़ता है

मैंने पहले दिया उत्तर अभी भी मान्य है यदि आप:

  • फायरबेज 2.x एसडीके का उपयोग करना
  • फायरबेज 9.0 या उच्चतर एसडीके का उपयोग करना, लेकिन [जैक्सन के लिए सीरिजलाइज़ करना / जावा को डीएसरिअलाइज़ करना – <JSON] (TODO: उत्तर के लिए लिंक)।

डेटा संरचना

हम अपने फ़ायरबेज डाटाबेस में इस JSON संरचना से शुरू करेंगे:

 { "-Jx86I5e8JBMZ9tH6W3Q" : { "handle" : "puf", "name" : "Frank van Puffelen", "stackId" : 209103, "stackOverflowId" : 209103 }, "-Jx86Ke_fk44EMl8hRnP" : { "handle" : "mimming", "name" : "Jenny Tong", "stackId" : 839465 }, "-Jx86N4qeUNzThqlSMer" : { "handle" : "kato", "name" : "Kato Wulf", "stackId" : 394010 } } 

पूर्ण उपयोगकर्ता लोड हो रहे हैं

अपने सबसे बुनियादी पर, हम प्रत्येक उपयोगकर्ता को इस JSON से निम्न जावा वर्ग में लोड कर सकते हैं:

 private static class CompleteUser { String handle; String name; long stackId; public String getHandle() { return handle; } public String getName() { return name; } public long getStackId() { return stackId; } @Override public String toString() { return "User{handle='"+handle+"', name='"+name+"', stackId="+stackId+ "'}"; } } 

अगर हम खेतों को सार्वजनिक करने की घोषणा करते हैं, तो हमें गेटर्स की ज़रूरत नहीं होती है:

 private static class CompleteUser { public String handle; public String name; public long stackId; } 

आंशिक रूप से उपयोगकर्ताओं को लोड कर रहा है

हम आंशिक रूप से उपयोगकर्ता को लोड कर सकते हैं, उदाहरण के लिए:

 private static class PartialUser { String handle; String name; public String getHandle() { return handle; } public String getName() { return name; } @Override public String toString() { return "User{handle='" + handle + "', NAME='" + name + "''}"; } } 

जब हम एक ही JSON से उपयोगकर्ताओं को लोड करने के लिए इस वर्ग का उपयोग करते हैं, कोड रन (मेरे दूसरे उत्तर में वर्णित जैक्सन संस्करण के विपरीत)। लेकिन आपको अपने लॉगिंग आउटपुट में एक चेतावनी दिखाई देगी:

चेतावनी: स्टेक के लिए कोई सेटर / फ़ील्ड क्लास एनोटेशन $ आंशिक उपयोगकर्ता पर पाया गया

तो इस से छुटकारा पाएं, हम @IgnoreExtraProperties साथ क्लास को एनोटेट कर सकते हैं:

 @IgnoreExtraProperties private static class PartialUser { String handle; String name; public String getHandle() { return handle; } public String getName() { return name; } @Override public String toString() { return "User{handle='" + handle + "', NAME='" + name + "''}"; } } 

आंशिक रूप से उपयोगकर्ताओं को बचत

पहले की तरह, आप उपयोगकर्ता की गणना की गई संपत्ति जोड़ सकते हैं। डेटा को डेटाबेस को सहेजते समय आप ऐसी संपत्ति को अनदेखा करना चाहते हैं। ऐसा करने के लिए, आप @Exclude साथ संपत्ति / @Exclude / सेटर / फ़ील्ड टिप्पणी कर सकते हैं:

 private static class OvercompleteUser { String handle; String name; long stackId; public String getHandle() { return handle; } public String getName() { return name; } public long getStackId() { return stackId; } @Exclude public String getTag() { return getName() + " ("+getHandle()+")"; } @Override public String toString() { return "User{handle='"+handle+"', name='"+name+"', stackId="+stackId+ "'}"; } } 

अब उपयोगकर्ता को डेटाबेस में लिखते समय, getTag() का मान को नजरअंदाज कर दिया जाएगा।

जावा कोड की तुलना में JSON में एक अलग प्रॉपर्टी नाम का उपयोग करना

आप यह भी निर्दिष्ट कर सकते हैं कि जावा कोड से फ़ील्ड / गेटर / सेटर नाम का नाम डेटाबेस में JSON में होना चाहिए। ऐसा करने के लिए: @PropertyName() साथ फ़ील्ड / गेटर / सेटर का एनोटेट करें

 private static class UserWithRenamedProperty { String handle; String name; @PropertyName("stackId") long stackOverflowId; public String getHandle() { return handle; } public String getName() { return name; } @PropertyName("stackId") public long getStackOverflowId() { return stackOverflowId; } @Override public String toString() { return "User{handle='"+handle+"', name='"+name+"', stackId="+stackOverflowId+ "'}"; } } 

सामान्य तौर पर जावा के बीच डिफ़ॉल्ट मैपिंग का उपयोग करना सबसे अच्छा है <-> JSON कि Firebase SDK का उपयोग करता है। लेकिन @PropertyName आवश्यकता हो सकती है जब आपके पास पहले से मौजूद जेएसओएन ढांचे है जो आप अन्यथा जावा कक्षाओं को नहीं मैप कर सकते हैं।

क्योंकि रूट में आपका गलत क्वेरी पथ फ़ोल्डर। यह उदाहरण है यहां छवि विवरण दर्ज करें

 My code: private void GetUpdates(DataSnapshot snapshot){ romchat.clear(); for (DataSnapshot ds: snapshot.getChildren()){ Rowitemroom row = new Rowitemroom(); row.setCaption(ds.getValue(Rowitemroom.class).getCaption()); row.setFileUrl(ds.getValue(Rowitemroom.class).getFileUrl()); romchat.add(row); /* Rowitemroom row = snapshot.getValue(Rowitemroom.class); String caption = row.getCaption(); String url = row.getFileUrl();*/ } if (romchat.size()>0){ adapter = new CustomRoom(context,romchat); recyclerView.setAdapter(adapter); }else { Toast.makeText(context, "No data", Toast.LENGTH_SHORT).show(); } } db_url ="your apps`enter code here`.appspot.com/admins"