2013-09-22 4 views
6

Ich analysiere diese Zeichenfolge mit JSON.parseFull(). Diese Methode ist für mich wirklich praktisch, weil ich die Ausgabe eine KarteIst es möglich, Scala's JSON.parseFull() ganze Zahlen als Dezimalzahlen zu behandeln?

val jStr = """{"wt":"json","rows":500}""" 
println(JSON.parseFull(jStr)) 

hier bekommen müssen:

Some(Map(wt -> json, rows -> 500.0)) // ´rows´ as Double 

Ich möchte ein Integer anstelle eines Doppel zurück zu bekommen.

Some(Map(wt -> json, rows -> 500)) // ´rows´ as Integer 

Ist das möglich?

Antwort

7

Von Scala's JSON documentation

Der Standardkonvertierung für Numerik ist in ein Doppel. Wenn Sie dieses Verhalten auf globaler Ebene überschreiben möchten, können Sie die globalNumberParser-Eigenschaft auf Ihre eigene (String => Any) -Funktion festlegen. Wenn Sie nur an der pro-Thread-Ebene außer Kraft setzen möchten, dann können Sie die perThreadNumberParser Eigenschaft auf Ihre Funktion gesetzt

in Ihrem Fall:

val myConversionFunc = {input : String => Integer.parseInt(input)} 
JSON.globalNumberParser = myConversionFunc 

scala> println (JSON.parseFull (jStr))

Einig (Karte (wt -> json, Reihen -> 500))

+0

Wie schlecht! Das bedeutet, dass ich alle Zahlen so behandeln muss, wie sie Integer oder Dezimal waren ... Für den Fall, den ich als Beispiel postete, ist Ok, aber was, wenn ich mit einem gemischten Fall von Zahlen zu tun hätte? Es wäre großartig, wenn ich nicht ganzzahlig als Ganzzahl und gebrochen als Dezimal erhalten könnte. Ich schätze, ich kann mich nicht auf JSON.parseFull() verlassen, und ich muss etwas zusätzlichen Code schreiben, um zu bekommen, was ich will. – Max

+0

Nicht unbedingt. Wenn Gleitkommazahlen immer einen Punkt haben, könnten Sie eine Konvertierungsfunktion schreiben, die einen Gleitkommawert für "100.0" und einen Int für "100" zurückgibt. –

+0

Scala's JSON-Dokumentationslink Nicht gefunden. – Alaeddine

3

Die Standard-Konvertierung von Numerik ist Doppel in scala

Grundsätzlich müssen Sie die Standardnummer Parser globalNumberParser zu int ersten

JSON.globalNumberParser = { 
    in => 
    try in.toInt catch { case _: NumberFormatException => in.toDouble} 
} 

val jStr = """{"wt":"json","rows":500}""" 
println(JSON.parseFull(jStr)) 

Ausgang setzen:

Some(Map(wt -> json, rows -> 500)) // ´rows´ as Integer 
Verwandte Themen