Search code examples
javajsonparsingdoublejson-simple

Parsing decimal numbers, some of which lack a decimal separator, in JSON data using JSON-Simple (Java)


I am trying to use the JSON-Simple JSON processor library.

When parsing JSON fragment such as:

"speed":1.13

…I call get and cast as a Double. No problem.

Double speed = ( Double ) wind.get( "speed" );

But then I encounter a value without a decimal fraction. Ex: 1 rather than 1.0.

"speed":1

Granted, the publisher of this data should have written "speed":1.0. But they did not.

My get with casting throws an exception:

Exception in thread "main" java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Double (java.lang.Long and java.lang.Double are in module java.base of loader 'bootstrap')

Apparently JSON-Simple insisted on parsing the JSON value of 1 as a Long. So I need a workaround, a way to tell JSON-Simple how to parse this particular element.

➥ Is there a way to tell JSON-Simple to parse the string inputs as Double regardless of whether a decimal separator (a decimal point) is present?

➥ Even better, can I tell JSON-Simple to parse the string input for a particular JSON element as BigDecimal to bypass the inaccuracy of floating-point? (that is, going from String to BigDecimal without involving floating-point along the way)


Solution

  • Use later version

    You are using the original JSON-Simple library led by Fang Yidong. Later versions 2 and 3 were developed as a fork at this Clifton Labs page on GitHub, led by Davin Loegering.

    The original does not support BigDecimal. The fork does supports BigDecimal. See the getBigDecimal method.

    The fork has changed the original library quite a bit. See the History section of that Clifton Labs page.