@@ -708,7 +708,7 @@ public void stringToValueNumbersTest() {
708708 * This test documents a need for BigDecimal conversion.
709709 */
710710 Object obj = JSONObject .stringToValue ( "299792.457999999984" );
711- assertTrue ( "evaluates to 299792.458 doubld instead of 299792.457999999984 BigDecimal!" ,
711+ assertTrue ( "evaluates to 299792.458 double instead of 299792.457999999984 BigDecimal!" ,
712712 obj .equals (new Double (299792.458 )) );
713713 assertTrue ( "1 should be an Integer!" ,
714714 JSONObject .stringToValue ( "1" ) instanceof Integer );
@@ -2042,7 +2042,7 @@ public void jsonObjectOptNoKey() {
20422042 */
20432043 @ Test
20442044 public void jsonObjectOptStringConversion () {
2045- JSONObject jo = new JSONObject ("{\" int\" :\" 123\" ,\" true\" :\" true\" ,\" false\" :\" false\" , \" largeNumber \" : \" 19007199254740993.35481234487103587486413587843213584 \" }" );
2045+ JSONObject jo = new JSONObject ("{\" int\" :\" 123\" ,\" true\" :\" true\" ,\" false\" :\" false\" }" );
20462046 assertTrue ("unexpected optBoolean value" ,jo .optBoolean ("true" ,false )==true );
20472047 assertTrue ("unexpected optBoolean value" ,jo .optBoolean ("false" ,true )==false );
20482048 assertTrue ("unexpected optInt value" ,jo .optInt ("int" ,0 )==123 );
@@ -2053,17 +2053,38 @@ public void jsonObjectOptStringConversion() {
20532053 assertTrue ("unexpected optBigDecimal value" ,jo .optBigDecimal ("int" ,BigDecimal .ZERO ).compareTo (new BigDecimal ("123" ))==0 );
20542054 assertTrue ("unexpected optBigDecimal value" ,jo .optBigDecimal ("int" ,BigDecimal .ZERO ).compareTo (new BigDecimal ("123" ))==0 );
20552055 assertTrue ("unexpected optNumber value" ,jo .optNumber ("int" ,BigInteger .ZERO ).longValue ()==123l );
2056+ }
2057+
2058+ /**
2059+ * Verifies that the opt methods properly convert string values to numbers and coerce them consistently.
2060+ */
2061+ @ Test
2062+ public void jsonObjectOptCoercion () {
2063+ JSONObject jo = new JSONObject ("{\" largeNumberStr\" :\" 19007199254740993.35481234487103587486413587843213584\" }" );
2064+ // currently the parser doesn't recognize BigDecimal, to we have to put it manually
2065+ jo .put ("largeNumber" , new BigDecimal ("19007199254740993.35481234487103587486413587843213584" ));
20562066
20572067 // Test type coercion from larger to smaller
2068+ assertEquals (new BigDecimal ("19007199254740993.35481234487103587486413587843213584" ), jo .optBigDecimal ("largeNumber" ,null ));
20582069 assertEquals (new BigInteger ("19007199254740993" ), jo .optBigInteger ("largeNumber" ,null ));
20592070 assertEquals (1.9007199254740992E16 , jo .optDouble ("largeNumber" ),0.0 );
20602071 assertEquals (1.90071995E16f , jo .optFloat ("largeNumber" ),0.0f );
20612072 assertEquals (19007199254740993l , jo .optLong ("largeNumber" ));
20622073 assertEquals (1874919425 , jo .optInt ("largeNumber" ));
2063-
2074+
2075+ // conversion from a string
2076+ assertEquals (new BigDecimal ("19007199254740993.35481234487103587486413587843213584" ), jo .optBigDecimal ("largeNumberStr" ,null ));
2077+ assertEquals (new BigInteger ("19007199254740993" ), jo .optBigInteger ("largeNumberStr" ,null ));
2078+ assertEquals (1.9007199254740992E16 , jo .optDouble ("largeNumberStr" ),0.0 );
2079+ assertEquals (1.90071995E16f , jo .optFloat ("largeNumberStr" ),0.0f );
2080+ assertEquals (19007199254740993l , jo .optLong ("largeNumberStr" ));
2081+ assertEquals (1874919425 , jo .optInt ("largeNumberStr" ));
2082+
20642083 // the integer portion of the actual value is larger than a double can hold.
20652084 assertNotEquals ((long )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ), jo .optLong ("largeNumber" ));
20662085 assertNotEquals ((int )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ), jo .optInt ("largeNumber" ));
2086+ assertNotEquals ((long )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ), jo .optLong ("largeNumberStr" ));
2087+ assertNotEquals ((int )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ), jo .optInt ("largeNumberStr" ));
20672088 assertEquals (19007199254740992l , (long )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ));
20682089 assertEquals (2147483647 , (int )Double .parseDouble ("19007199254740993.35481234487103587486413587843213584" ));
20692090 }
0 commit comments