2012-10-29 15 views
7

में मूल्य के आधार पर सीरियलाइजेशन से कुछ फ़ील्ड को छोड़कर मैं अपने क्रमिक उद्देश्यों के लिए जीएसओएन का उपयोग कर रहा हूं, मुझे फ़ील्ड के मूल्य के आधार पर जीसन द्वारा प्रदान किए गए बहिष्करण वर्ग श्रेणी के आधार पर क्रमिकरण से कुछ फ़ील्ड को छोड़ने का कोई तरीका नहीं मिल रहा है, क्योंकि यह केवल शीर्ष स्तर की कक्षा या क्षेत्र विशेषताओं आधारित बहिष्करण का समर्थन करता है। फ़ील्ड विशेषताओं में उस फ़ील्ड का मान शामिल नहीं है। तो मुझे क्या करना चाहिए?जीएसओएन

उत्तर

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

@ एम-टी-ए संपादन के लिए धन्यवाद। – Atharva

+1

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

+0

ध्यान दें कि 'जेसनसेरियलाइज़र' के प्रलेखन में कहा गया है: 'नए अनुप्रयोगों को टाइपएडाप्टर पसंद करना चाहिए, जिसका स्ट्रीमिंग एपीआई इस इंटरफेस के पेड़ एपीआई से अधिक कुशल है। – user905686

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); 
     } 
    } 
} 
} 
संबंधित मुद्दे