2016-05-27 8 views
0

Ich versuche gerade, den JSONParser des Codenamens auf api zu verwenden.Warum gibt der JSONParser immer ein Double zurück?

Auf der Backend-Seite gibt es einen langen Wert senden, aber in meiner Anwendung gibt es einen doppelten Wert analysiert.

Ich weiß, dass es eine Methode gibt zu sagen setUseLongs (boolean) und ich habe dieses Feld bereits auf True festgelegt. Wenn ich den Parser instanziiere und System.out.println (p.isUseLong) anrufe, druckt es true.

Das Feld wird jedoch immer noch als Doppelwert analysiert, obwohl es als langer Wert gesendet wird.

Was fehlt mir hier? Hier

ist der Code:

@Override 
protected void readResponse(InputStream input) throws IOException { 
    JSONParser.setUseLongs(true); 
    JSONParser p = new JSONParser(); 
    System.out.println(p.isUseLongs()); //true and a Warning to use static methods static... 
    Map<String,Object> data = p.parseJSON(new InputStreamReader(input)); 
    System.out.println(data); //long value already printed as double 
} 

EDIT

Hier ist die JSON String (in der letzten Zeile gedruckt wird, die Parser Ausgang):

[ 
{createdByUserId=1364.0, //should be int 
createdAtDate=1.464330197735E12, //should be long 
deleted=false, //boolean, correct 
updatedAtDate=1.464330197735E12, //long 
name=Hallo1, //String, correct 
... 
] 
+0

Vielleicht kann die Aktualisierung Ihrer Bibliothek helfen, da ein Fehler damit verbunden war: https://github.com/codenameone/codenameone/issues/1254 –

+0

danke, aktualisiert meine libs, refreshed libs, immer noch die gleichen –

+0

Es vielleicht nützlich, um uns den JSON-Text zu zeigen. –

Antwort

3
//Assuming all elements are double 
createdByUserId.intvalue(); 
createdAtDate.longValue(); 

JSONParser hat eine setUseLongs Methode, die l verwendet Objekte für lange Werte und doppelt für doppelte Werte. Dies ist standardmäßig deaktiviert, um Kompatibilität und Unannehmlichkeiten in Codename One zu vermeiden.

Derzeit Codename One beinhaltet nicht die Number Klasse, die eine Basisklasse für alle numerischen Werte ist so normalerweise in Standard-Java Sie so etwas wie tun würde:

long l = ((Number)val).longValue(); 

Welche macht mehr Sinn, da Sie nicht sind sich darauf verlassen, was der Parser zurückgegeben hat. Leider wird dies zur Zeit nicht unterstützt, aber ich habe ein Problem hinzugefügt, um diese Adresse zu adressieren here.

+0

Right. Ich fügte der Antwort einige Details hinzu, um zu erklären, warum es so ist. –

+0

@ShaiAlmog, @TimWeber Das hat mein Problem nicht gelöst. Die Variable 'createdAt' ist vom Typ double, hat aber keine Funktion' longValue() ' –

+0

' double' mit Kleinbuchstaben d ist ein primitiver Typ, der autoboxed ist. Stellen Sie sicher, dass Sie 'Double' mit Großbuchstaben verwenden. –

Verwandte Themen