How to exclude null-value fields when using Flexjson?
-
11-02-2021 - |
Pergunta
I am serializing a class like this into JSON using Flexjson:
public class Item {
private Long id;
private String name;
private String description;
...
// Getters and setters
...
}
Many of the Item fields can be null (e.g., description). Consequently, when such an Item object is serialized using Flexjson, I get the following JSON:
{"id":62,"name":"Item A","description":null,...}
Since, as I already mentioned, an Item object may contain many null-value fields, the outcoming JSON is longer than effectively needed. This is in so far a problem, because I would like to send the generated JSON from a web server to a mobile client over a wireless connection via WiFi, 3G, EDGE or GPRS (i.e., more bandwidth is required, which results in less speed).
Therefore, I wanted to ask how it is possible to (efficiently) exclude null-value attributes using Flexjson?
Thanks!
Solução
You can use the following transformer :
import flexjson.transformer.AbstractTransformer;
public class ExcludeTransformer extends AbstractTransformer {
@Override
public Boolean isInline() {
return true;
}
@Override
public void transform(Object object) {
// Do nothing, null objects are not serialized.
return;
}
}
with the following usage :
new JSONSerializer().transform(new ExcludeTransformer(), void.class).serialize(yourObject)
Note that all null fields will be excluded.
Adding the Transformer by Path (vs by Class) is not supported as FlexJSON forces TypeTransformer for null values :
JSONContext.java : line 95 :
private Transformer getPathTransformer(Object object) {
if (null == object) return getTypeTransformer(object);
return pathTransformerMap.get(path);
}
Outras dicas
I am a newbie,i had same problem and could not find any solution on source forge so i used regular expression to remove all the nulls from JSON String
/**
* This Function removes all the key:value pairs from the Json String for which the value equals null
* @param jsonStringWithNullKeys
* @return jsonStringWithoutNullKeys
*/
public static String getJsonStringWithoutNullKeys(String jsonStringWithNullKeys)
{
Pattern p = Pattern.compile( "([,]?\"[^\"]*\":null[,]?)+" );
Matcher m = p.matcher( jsonStringWithNullKeys );
StringBuffer newString = new StringBuffer( jsonStringWithNullKeys.length() );
while( m.find() )
{
if( m.group().startsWith( "," ) & m.group().endsWith( "," ) ) m.appendReplacement( newString, "," );
else
m.appendReplacement( newString, "" );
}
m.appendTail( newString );
return newString.toString();
}
I haven't tried out your situation exactly, but I believe the following should solve your problem:
Item item;
// Assign item here
JSONSerializer json = new JSONSerializer();
if ( item.description != null ) {
json.exclude( field );
}
return json.serialize(item);
Clearly, you'd probably access the description field using a getter. Additionally, you might want to iterate your instance fields using reflection to exclude the null-fields.