Jayway jsonpath возвращает значение в формате с плавающей запятой. Как получить исходный числовой формат в String, используя Java или Scala? - PullRequest
0 голосов
/ 01 мая 2018

Я использую jayway JsonPath. Предположим, у меня Json вот так: JSONObject:

{ 
"balance": 50000000000000.0
}

jspath: $.balance


 val response =JsonPath.parse(jsonObject).read(jsPath).toString
println("response: ", response )

здесь я получаю значение как "response: 5.0E7", но я хочу его как "50000000000000.0"

Я знаю, как конвертировать из двойной в строку. Но в моем случае я должен вызвать внешний Rest API, и я получу json в качестве ответа, основываясь на jspath, который должен получить исходное значение. Это означает, что один и тот же код должен работать с строковым, целочисленным и двойным типами с исходным содержимым, но не с определенным форматом содержимого.

{ 
"balance": "50000000000000.0" (here balance is string)
}
expected: 50000000000000.0 result: 50000000000000.0

{ 
"balance": 50000000000000.00 (here balance is double)
}
expected: 50000000000000.0 result: 5.0E7(but I need 50000000000000.0)

Один и тот же код, он должен работать для обоих сценариев, или есть какая-то другая библиотека, чтобы получить это решение, или есть шанс получить тип возвращаемого значения из read (), поэтому с помощью обработки исключений я могу справиться с этим.

1 Ответ

0 голосов
/ 01 мая 2018

Поскольку вы используете Scala, вы можете просто считать значение как Any и отформатировать его с помощью сопоставления с образцом, например ::

val response: Any = JsonPath.parse(jsonObject).read(jsPath)
val formattedResponse = response match {
  case d: Double => d.formatted("%f")
  case _ => response.toString
}

В качестве альтернативы вы можете настроить Jayway JsonPath так, чтобы он всегда анализировал плавающие числа как BigDecimal, чья toString в большинстве случаев будет печатать значение без показателей степени (если это не действительно малая дробь (~ <1e-6), которая в любом случае будет более читается с показателем степени) и имеет дополнительное преимущество, заключающееся в способности хранить более длинные числа без потери точности. Однако для этого потребуется настроить JsonPath с <a href="https://github.com/json-path/JsonPath#jsonprovider-spi" rel="nofollow noreferrer"> JsonProvider , который всегда использует BigDecimal (по умолчанию SmartJson не может этого сделать, Джексон будет работать нормально).

...