2013-09-22 6 views
6

Przetwarzam ten ciąg za pomocą JSON.parseFull(). Metoda ta jest bardzo wygodne dla mnie, bo muszę dostać mapęCzy jest możliwe, aby Scala JSON.parseFull() nie traktować liczb całkowitych jako ułamków dziesiętnych?

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

Oto wynik:

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

Chciałbym wrócić liczbą całkowitą zamiast podwójnej.

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

Czy to możliwe?

Odpowiedz

7

Od Scala's JSON documentation

Domyślna konwersji dla numerycznych jest w podwójne. Jeśli chcesz zastąpić to zachowanie na poziomie globalnym, możesz ustawić właściwość globalNumberParser na własną (funkcja String => Any). Jeśli tylko chcesz nadpisać na poziomie per-thread następnie można ustawić właściwość perThreadNumberParser do funkcji

w przypadku:

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

scala> println (JSON.parseFull (jStr))

Niektóre (Map (wt -> JSON rzędy -> 500))

+0

Jak źle! Oznacza to, że muszę traktować wszystkie liczby jako całkowite lub dziesiętne ... Dla przypadku, który napisałem jako przykład, jest OK, ale co, gdybym miał do czynienia z mieszanym przypadkiem liczb? Byłoby wspaniale, gdybym mógł uzyskać nie ułamkowe jako liczby całkowite i ułamkowe jako dziesiętne. Chyba nie mogę polegać na JSON.parseFull() i muszę napisać jakiś dodatkowy kod, aby uzyskać to, czego chcę. – Max

+0

Niekoniecznie. Jeśli liczby zmiennoprzecinkowe mają zawsze kropkę, można napisać funkcję konwersji, która zwróciła wartość Float dla "100.0" i Int dla "100" –

+0

Scala JSON link do dokumentacji Nie znaleziono. – Alaeddine

3

domyślna konwersji numerycznych jest dwukrotnie w scala

Zasadniczo trzeba ustawić domyślny numer parser globalNumberParser do int pierwszy

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

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

wyjściowa:

Some(Map(wt -> json, rows -> 500)) // ´rows´ as Integer 
Powiązane problemy