2012-08-22 22 views
11

Hola ¿Puedo configurar GSON que use int en lugar de los datos de dobles tienes como:Gson uso de fuerza int en lugar de la doble

{fn: chat, data: {roomId: 1, text: "Some brabble"}} 

Tengo una PacketClass deserializar a:

public class DataPacket { 
    private String fn; 
    private Object p; // will be a StringMap 
} 

y decodificar como:

DataPacket pkg = gson.fromJson(message, DataPacket.class); 

para una mejor typehandling tengo un POJO datos para el campo DataPacket.p por ejemplo:

public class ChatPacket { 
    public int roomId; 
    public String message; 
    public String from; 
    // getter & setter 
} 

para analizar los datos para el paquete i uso BeanMaps como (i quitado de manejo de errores, etc):

public Object getData(Class<?> pojoClass) { 
    pojo = pojoClass.newInstance(); 
    BeanMap b = new BeanMap(); 
    b.setBean(pojo); 
    b.putAll(this.p); 
    pojo = b.getBean(); 
} 

El problema es ahora que GSON hacer el roomid: 1 a un doble 1,0 en el StringMap y el mapa de bean intentan analizarlo en un entero y arroja una NumberFormatException, ¿alguien tiene una idea de cómo solucionar esto?

¡Gracias!

+3

Todos los valores numéricos en JSON son punto flotante de precisión doble. JSON no tiene ningún tipo de entero. –

+0

Consideraría esto como una deficiencia mayor de la especificación JSON. Debería definir un tipo de entero simple y no dejar esto en diferentes implementaciones. (I ' Estoy corriendo en esto también. El sistema con el que me estoy comunicando utiliza a Gson y lo convierte en en flotadores, que no se vuelven a convertir en ints ya que hay una pérdida de precisión.) –

+0

Keith, no he notado ninguna pérdida de precisión al hacer lo siguiente: 'final Long lTest = Math.round (doubleValue); Log.i ("Test", String.valueOf (lTest)); // decimal Log.i ("Test", Long.toHexString (lTest)); // hex ' –

Respuesta

1

creo que simplemente podría cambiar su clase de paquete de datos a

public class DataPacket { 
    private String fn; 
    private ChatPacket p; // will be a StringMap 
} 

(sustituir por objeto ChatPacket) - si que se adapte al resto de la aplicación. Gson luego reconocerá los tipos de datos de la clase ChatPacket y caracterizará el "1" como int.

EDITAR (ya que no puede utilizar las características de formato completo en los comentarios :-()

Puede utilizar una combinación de Gson y es de bajo nivel de ayudante JsonParser así:

String testStr = "{fn: chat, data: {roomId: 1, message: \"Some brabble\"}}"; 
DataPacket dp = new Gson().fromJson(testStr, DataPacket.class); 
JsonParser parser = new JsonParser(); 
JsonElement e = parser.parse(testStr); 
ChatPacket cp = new Gson().fromJson(e.getAsJsonObject().getAsJsonObject("data"), ChatPacket.class); 
+0

y pero esto no tiene muchos paquetes dinámicamente y quiero minificar el proceso de crear nuevos paquetes. – Kani

+0

Ok, entendí ese punto. ¿Qué hay de cambiar Object a String? Para tener la cadena json "cruda" en su DataPacket y agregar otro campo String que defina el nombre de clase de sus datos transportados. Podrías dejar que otra llamada Gson con esa clase dinámica haga el mapeo de la clase interna. –

+0

hizo ese trabajo ¿Gson pone la cadena sin procesar en el valor de la cadena? cuando esto es cierto, entonces es la solución, lo intentaré más tarde ¡gracias! – Kani

Cuestiones relacionadas