में मूल्य के आधार पर सीरियलाइजेशन से कुछ फ़ील्ड को छोड़कर मैं अपने क्रमिक उद्देश्यों के लिए जीएसओएन का उपयोग कर रहा हूं, मुझे फ़ील्ड के मूल्य के आधार पर जीसन द्वारा प्रदान किए गए बहिष्करण वर्ग श्रेणी के आधार पर क्रमिकरण से कुछ फ़ील्ड को छोड़ने का कोई तरीका नहीं मिल रहा है, क्योंकि यह केवल शीर्ष स्तर की कक्षा या क्षेत्र विशेषताओं आधारित बहिष्करण का समर्थन करता है। फ़ील्ड विशेषताओं में उस फ़ील्ड का मान शामिल नहीं है। तो मुझे क्या करना चाहिए?जीएसओएन
Q
जीएसओएन
7
A
उत्तर
19
यह प्राप्त करने का तरीका कक्षा में प्रश्न के लिए कस्टम सीरिएलाइज़र बनाकर है। Gson को डिफ़ॉल्ट रूप से JSON ऑब्जेक्ट बनाने की अनुमति देने के बाद, उस प्रॉपर्टी को हटा दें जिसे आप इसके मूल्य के आधार पर बाहर करना चाहते हैं।
public class SerializerForMyClass implements JsonSerializer<MyClass> {
@Override
public JsonElement serialize(MyClass obj, Type type, JsonSerializationContext jsc) {
Gson gson = new Gson();
JsonObject jObj = (JsonObject)gson.toJsonTree(obj);
if(obj.getMyProperty()==0){
jObj.remove("myProperty");
}
return jObj;
}
}
और Gson उद्देश्य यह है कि आप इस वर्ग के लिए आवेदन में क्रमांकन के लिए उपयोग में नए serializer दर्ज की।
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyClass.class, new SerializerForMyClass());
Gson gson=gsonBuilder.create();
gson.toJson(myObjectOfTypeMyClass);
0
यहां कक्षा मैं सभी झूठे बूलियन्स के साथ ही सभी "गलत" तार हटाने के लिए लिखा था की गहराई उदाहरण में एक अधिक है। इसे बहुत जल्दी से फेंक दिया गया था लेकिन ठीक काम करता प्रतीत होता है। अगर आपको कोई भी बग मिलती है तो मुझे बताएं।
public class RemoveFalseJsonSerializer implements JsonSerializer<Object> {
//~ Methods --------------------------------------------------------------------------------------------------------
/**
* serialize
*
* @param object in value
* @param type in value
* @param jsonSerializationContext in value
*
* @return out value
*/
@Override
public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonSerializationContext) {
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(object);
trimJson(jsonElement);
return jsonElement;
}
/**
* We've finally made it to a primitive of some sort. Should we trim it?
*
* @param jsonElement in value
*
* @return out value
*/
private boolean shouldTrimElement(JsonElement jsonElement) {
return jsonElement == null || jsonElement.isJsonNull()
|| (jsonElement.isJsonPrimitive()
&& ((jsonElement.getAsJsonPrimitive().isBoolean() && !jsonElement.getAsBoolean()) // trim false
|| (jsonElement.getAsJsonPrimitive().isString() // also trim the string "false"
&& "false".equalsIgnoreCase(jsonElement.getAsString()))));
}
/**
* trimJson
*
* @param jsonElement in value
*/
private void trimJson(JsonElement jsonElement) {
if (jsonElement == null || jsonElement.isJsonNull() || jsonElement.isJsonPrimitive()) {
return;
}
if (jsonElement.isJsonObject()) {
List<String> toRemove = new ArrayList<>();
JsonObject asJsonObject = jsonElement.getAsJsonObject();
for (Map.Entry<String, JsonElement> jsonElementEntry : asJsonObject.entrySet()) {
if (jsonElementEntry.getValue().isJsonObject() || jsonElementEntry.getValue().isJsonArray()) {
trimJson(jsonElementEntry.getValue());
} else if (shouldTrimElement(jsonElementEntry.getValue())) {
toRemove.add(jsonElementEntry.getKey());
}
}
if (CollectionUtils.isNotEmpty(toRemove)) {
for (String remove : toRemove) {
asJsonObject.remove(remove);
}
}
} else if (jsonElement.isJsonArray()) {
JsonArray asJsonArray = jsonElement.getAsJsonArray();
for (JsonElement element : asJsonArray) {
trimJson(element);
}
}
}
}
संबंधित मुद्दे
- 1. जीएसओएन
- 2. जीएसओएन
- 3. एंड्रॉइड JSONObject बनाम जीएसओएन
- 4. जीएसओएन सीरियलाइजेशन बहुत धीमा
- 5. जीएसओएन एक जावा थ्रोबल
- 6. जीएसओएन: कस्टम ऑब्जेक्ट deserialization
- 7. जीएसओएन: अपेक्षित BEGIN_OBJECT लेकिन STRING
- 8. जीएसओएन पार्सिंग गतिशील JSON फ़ील्ड
- 9. कस्टम ऑब्जेक्ट्स के जीएसओएन Deserializing ऐरे
- 10. विशिष्ट निर्माता का उपयोग करने के लिए फोर्स जीएसओएन
- 11. जीएसओएन अपवाद पार्सिंग खाली फेंक देता है दिनांक क्षेत्र
- 12. जीएसओएन के साथ मानचित्र के मानचित्र को क्रमबद्ध कैसे करें?
- 13. जीएसओएन के साथ गतिशील JSON फ़ील्ड को कैसे पार्स करें?
- 14. जीएसओएन: एक स्ट्रिंग की उम्मीद है लेकिन BEGIN_OBJECT था?
- 15. जीएसओएन: जेसन से केस असंवेदनशील तत्व कैसे प्राप्त करें?
- 16. जीएसन स्ट्रिंग को प्रिंट करने के लिए जीएसओएन स्ट्रिंग
- 17. जीएसओएन फ़ील्ड का उपयोग क्यों करता है न कि गेटर्स/सेटर?
- 18. जीएसओएन टाइप टोकन क्लास में कस्टम जेनेरिक का उपयोग कैसे करें?
- 19. जीएसओएन मेरे टाइपएडाप्टर को एक प्रकार के लिए कॉल नहीं कर रहा है जो इंटरफेस
- 20. जीएसओएन पुस्तकालयों का उपयोग कर यूआरएल (रीस्टफुल webservice) से जेएसओएन स्ट्रिंग को पार्स करना। एंड्रॉइड
- 21. आप शून्य या खाली वस्तुओं और खाली सरणी और सूचियों को छोड़ने के लिए जीएसओएन कैसे प्राप्त करते हैं?
- 22. POJO
- 23. जावा में जेएसओएन को स्पष्ट रूप से कैसे बनाया जाए?
- 24. JSON स्ट्रिंग
- 25. जावा में टाइप करें
- 26. एंड्रॉइड JSON पुस्तकालयों की प्रदर्शन और उपयोगिता तुलना
- 27. जेसनऑब्जेक्ट/जेसनएरे के मूल्यों को सीधे कैसे संशोधित करें?
- 28. एंड्रॉइड
- 29. एंड्रॉइड
- 30. जेएसओएन से जावा एनम
@ एम-टी-ए संपादन के लिए धन्यवाद। – Atharva
मेरे मामले में मैं सभी झूठे बूलियन (संपूर्ण तत्व) को हटाना चाहता था, दुर्भाग्य से इस विधि का उपयोग करना संभव नहीं है। यदि आप ऐसा करने के लिए एक कुशल तरीका सीखते हैं, तो मुझे इसके बारे में जानकर खुशी होगी। मैंने सभी सुपर ऑब्जेक्ट्स को अवरुद्ध कर दिया और मैन्युअल रूप से प्रत्येक झूठी बूलियन संपत्ति को हटा दिया। – Steven
ध्यान दें कि 'जेसनसेरियलाइज़र' के प्रलेखन में कहा गया है: 'नए अनुप्रयोगों को टाइपएडाप्टर पसंद करना चाहिए, जिसका स्ट्रीमिंग एपीआई इस इंटरफेस के पेड़ एपीआई से अधिक कुशल है। – user905686