2011-10-25 13 views
5

Estoy serializar una clase como esta en JSON usando Flexjson:¿Cómo se excluyen los campos de valor nulo cuando se usa Flexjson?

public class Item { 
    private Long id; 
    private String name; 
    private String description; 
    ... 

    // Getters and setters 
    ... 
} 

Muchos de los campos del artículo puede ser nulo (por ejemplo, descripción). En consecuencia, cuando un objeto tal artículo se serializa utilizando Flexjson, consigo el siguiente JSON:

{"id":62,"name":"Item A","description":null,...} 

Dado que, como ya se ha mencionado, un objeto de artículo puede contener muchos campos null-valor, el outcoming JSON es más largo que efectivamente necesario. Esto es hasta ahora un problema, porque me gustaría enviar el JSON generado desde un servidor web a un cliente móvil a través de una conexión inalámbrica a través de WiFi, 3G, EDGE o GPRS (es decir, se requiere más ancho de banda, lo que da como resultado menos velocidad)

Por lo tanto, quería preguntar cómo es posible (eficientemente) excluir los atributos de valor nulo usando Flexjson?

Gracias!

Respuesta

16

Usted puede utilizar el siguiente transformador:

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; 
    } 
} 

con el siguiente uso:

new JSONSerializer().transform(new ExcludeTransformer(), void.class).serialize(yourObject) 

Tenga en cuenta que serán excluidos todos los campos nulos.

Adición del transformador por el camino (vs por clase) no se admite como Flexjson fuerzas TypeTransformer de valores nulos:

JSONContext.java: Línea 95:

0

No he probado a cabo su situación exactamente, pero creo que el siguiente debería resolver su problema:

Item item; 
// Assign item here 
JSONSerializer json = new JSONSerializer(); 
if (item.description != null) { 
    json.exclude(field); 
} 
return json.serialize(item); 

Claramente, lo que probablemente accede al campo de descripción mediante un captador. Además, es posible que desee iterar los campos de su instancia usando reflection para excluir los campos nulos.

+0

Sí, me parece que esta es la única solución. Gracias – Matthias

+0

No hay problema. :) – conciliator

1

Yo soy muy novato, que tenía mismo problema y no podía encontrar ninguna solución en Source Forge, así que utiliza expresiones regulares para eliminar todos los valores nulos de JSON cadena

/** 
* 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(); 
} 
Cuestiones relacionadas