You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2010/03/17 23:23:33 UTC

svn commit: r924526 - in /shindig/trunk/java/common/src: main/java/org/apache/shindig/common/util/JsonConversionUtil.java test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java

Author: johnh
Date: Wed Mar 17 22:23:32 2010
New Revision: 924526

URL: http://svn.apache.org/viewvc?rev=924526&view=rev
Log:
Return verbatim String when converting overflow/truncated single-valued JSON data.

Issue identified by Louis Ryan.


Modified:
    shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/JsonConversionUtil.java
    shindig/trunk/java/common/src/test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java

Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/JsonConversionUtil.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/JsonConversionUtil.java?rev=924526&r1=924525&r2=924526&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/JsonConversionUtil.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/common/util/JsonConversionUtil.java Wed Mar 17 22:23:32 2010
@@ -190,8 +190,17 @@ public class JsonConversionUtil {
         // Attempt to parse as an array of literals
         JSONArray parsedArray = new JSONArray('[' + value + ']');
         if (parsedArray.length() == 1) {
-          // Not an array
-          return parsedArray.get(0);
+          // Not an array.
+          Object obj = parsedArray.get(0);
+          if (obj instanceof Double && !obj.toString().equals(value)) {
+            // Numeric overflow or truncation occurred. ie. large int/long
+            // converted to Double with exponent or Double truncated.
+            // In Shindig we return this as a verbatim String to avoid
+            // loss of data on input, as with lengthy ID values consisting
+            // of only numbers.
+            return value;
+          }
+          return obj;
         }
         return parsedArray;
       } catch (JSONException je) {

Modified: shindig/trunk/java/common/src/test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java?rev=924526&r1=924525&r2=924526&view=diff
==============================================================================
--- shindig/trunk/java/common/src/test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java (original)
+++ shindig/trunk/java/common/src/test/java/org/apache/shindig/common/util/JsonConversionUtilTest.java Wed Mar 17 22:23:32 2010
@@ -55,6 +55,16 @@ public class JsonConversionUtilTest exte
   @Test
   public void testValueToJsonParsing()
       throws Exception {
+    String longNumber = "108502345354398668456";
+    assertJsonEquals(JsonConversionUtil.convertToJsonValue(longNumber), longNumber);
+    String longDoubleOverflow = "108502345354398668456.1234";
+    assertJsonEquals(JsonConversionUtil.convertToJsonValue(longDoubleOverflow),
+        longDoubleOverflow);
+    String longDoubleFractionPart = "1.108502345354398668456108502345354398668456";
+    assertJsonEquals(JsonConversionUtil.convertToJsonValue(longDoubleFractionPart),
+        longDoubleFractionPart);
+    assertJsonEquals(JsonConversionUtil.convertToJsonValue("12345"), 12345);
+    assertJsonEquals(JsonConversionUtil.convertToJsonValue("12.345"), 12.345);
     assertJsonEquals(JsonConversionUtil.convertToJsonValue("abc"), "abc");
     assertJsonEquals(JsonConversionUtil.convertToJsonValue("\"a,b,c\""), "a,b,c");
     assertJsonEquals(JsonConversionUtil.convertToJsonValue("true"), true);