2012-08-22 13 views
11

Hi mogę skonfigurować gson że używać int zamiast podwójnych danych GOT jak:Gson użycie siły int zamiast podwójnego

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

mam PacketClass deserializować go:

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

i dekodować jak:

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

dla lepszej typehandling dostałem POJO danych dla pola DataPacket.p na przykład:

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

do analizowania danych pakietu i wykorzystać BeanMaps jak (i ​​usunięto obsługę błędów itp):

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

Problemem jest to, że teraz gson dokonać roomId: 1 do podwójnego 1,0 w The StringMap i beanmap próbują parsować ją do liczby całkowitej i generują wyjątek NumberFormatException, każdy ma pomysł, jak to naprawić?

Dziękujemy!

+3

Wszystko wartości liczbowe w JSON są zmiennoprzecinkowymi podwójną precyzją JSON nie ma typu całkowitoliczbowego –

+0

Uznałbym to za poważny niedobór specyfikacji JSON.Trzeba zdefiniować prosty typ całkowity i nie pozostawiać tego różnym implementacjom. m również w to działa.Komór, z którym się komunikuję, używa Gsona i zamienia ints w płaszcze, które nie konwertują z powrotem na ints, ponieważ występuje utrata precyzji.) –

+0

Keith, nie zauważyłem żadnej utraty dokładności podczas wykonywania następujących czynności: 'final Long lTest = Math.round (doubleValue); Log.i ("Test", String.valueOf (lTest)); // dziesiętny Log.i ("Test", Long.toHexString (lTest)); // hex' –

Odpowiedz

1

Myślę, że można po prostu zmienić klasę DataPacket do

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

(zastąpić obiektu poprzez ChatPacket) - czy to pasuje do reszty aplikacji. Następnie Gson rozpozna typy danych klasy ChatPacket i będzie oznaczać "1" jako int.

EDIT (jak nie można korzystać z wszystkich funkcji formatowania w komentarzach :-()

Można użyć kombinacji Gson i to niski poziom pomocnika JsonParser tak:

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, ale to nie jest dynamicznie ma wiele pakietów i chcę zminimalizować proces tworzenia nowych pakietów. – Kani

+0

Ok, rozumiem. A co ze zmianą Object to String - aby mieć "surowy" ciąg json w swoim DataPacket i dodać kolejne pole String, które definiuje nazwę klasy transportowanych danych. Następnie możesz pozwolić, aby inne wywołanie Gsona z tą dynamiczną klasą odwzorowywało wewnętrzną klasę. –

+0

czy ta praca nie gson umieścić surowy ciąg na wartość ciągu? kiedy to prawda, to jest rozwiązanie, niech źle później dziękuję! – Kani

Powiązane problemy