@@ -2041,7 +2041,7 @@ private static int getAnnotationDepth(final Method m, final Class<? extends Anno
20412041 return 1 ;
20422042 }
20432043
2044- // since we've already reached the Object class, return -1;
2044+ // we've already reached the Object class
20452045 Class <?> c = m .getDeclaringClass ();
20462046 if (c .getSuperclass () == null ) {
20472047 return -1 ;
@@ -2391,7 +2391,6 @@ public static Writer quote(String string, Writer w) throws IOException {
23912391
23922392 char b ;
23932393 char c = 0 ;
2394- String hhhh ;
23952394 int i ;
23962395 int len = string .length ();
23972396
@@ -2482,7 +2481,7 @@ public boolean similar(Object other) {
24822481 return false ;
24832482 }
24842483 return checkSimilarEntries (other );
2485- } catch (Throwable exception ) {
2484+ } catch (Exception e ) {
24862485 return false ;
24872486 }
24882487 }
@@ -2499,14 +2498,20 @@ private boolean checkSimilarEntries(Object other) {
24992498 return false ;
25002499 }
25012500
2502- if (!checkThis (valueThis , valueOther )) {
2501+ if (!checkObjectType (valueThis , valueOther )) {
25032502 return false ;
25042503 }
25052504 }
25062505 return true ;
25072506 }
25082507
2509- private boolean checkThis (Object valueThis , Object valueOther ) {
2508+ /**
2509+ * Convenience function. Compares types of two objects.
2510+ * @param valueThis Object whose type is being checked
2511+ * @param valueOther Reference object
2512+ * @return true if match, else false
2513+ */
2514+ private boolean checkObjectType (Object valueThis , Object valueOther ) {
25102515 if (valueThis instanceof JSONObject ) {
25112516 return ((JSONObject )valueThis ).similar (valueOther );
25122517 } else if (valueThis instanceof JSONArray ) {
@@ -2619,6 +2624,7 @@ public static Object stringToValue(String string) {
26192624 try {
26202625 return stringToNumber (string );
26212626 } catch (Exception ignore ) {
2627+ // Do nothing
26222628 }
26232629 }
26242630 return string ;
@@ -2639,41 +2645,10 @@ protected static Number stringToNumber(final String val) throws NumberFormatExce
26392645 if ((initial >= '0' && initial <= '9' ) || initial == '-' ) {
26402646 // decimal representation
26412647 if (isDecimalNotation (val )) {
2642- // Use a BigDecimal all the time so we keep the original
2643- // representation. BigDecimal doesn't support -0.0, ensure we
2644- // keep that by forcing a decimal.
2645- try {
2646- BigDecimal bd = new BigDecimal (val );
2647- if (initial == '-' && BigDecimal .ZERO .compareTo (bd )==0 ) {
2648- return Double .valueOf (-0.0 );
2649- }
2650- return bd ;
2651- } catch (NumberFormatException retryAsDouble ) {
2652- // this is to support "Hex Floats" like this: 0x1.0P-1074
2653- try {
2654- Double d = Double .valueOf (val );
2655- if (d .isNaN () || d .isInfinite ()) {
2656- throw new NumberFormatException ("val [" +val +"] is not a valid number." );
2657- }
2658- return d ;
2659- } catch (NumberFormatException ignore ) {
2660- throw new NumberFormatException ("val [" +val +"] is not a valid number." );
2661- }
2662- }
2648+ return getNumber (val , initial );
26632649 }
26642650 // block items like 00 01 etc. Java number parsers treat these as Octal.
2665- if (initial == '0' && val .length () > 1 ) {
2666- char at1 = val .charAt (1 );
2667- if (at1 >= '0' && at1 <= '9' ) {
2668- throw new NumberFormatException ("val [" +val +"] is not a valid number." );
2669- }
2670- } else if (initial == '-' && val .length () > 2 ) {
2671- char at1 = val .charAt (1 );
2672- char at2 = val .charAt (2 );
2673- if (at1 == '0' && at2 >= '0' && at2 <= '9' ) {
2674- throw new NumberFormatException ("val [" +val +"] is not a valid number." );
2675- }
2676- }
2651+ checkForInvalidNumberFormat (val , initial );
26772652 // integer representation.
26782653 // This will narrow any values to the smallest reasonable Object representation
26792654 // (Integer, Long, or BigInteger)
@@ -2694,6 +2669,57 @@ protected static Number stringToNumber(final String val) throws NumberFormatExce
26942669 throw new NumberFormatException ("val [" +val +"] is not a valid number." );
26952670 }
26962671
2672+ /**
2673+ * Convenience function. Block items like 00 01 etc. Java number parsers treat these as Octal.
2674+ * @param val value to convert
2675+ * @param initial first char of val
2676+ * @throws exceptions if numbers are formatted incorrectly
2677+ */
2678+ private static void checkForInvalidNumberFormat (String val , char initial ) {
2679+ if (initial == '0' && val .length () > 1 ) {
2680+ char at1 = val .charAt (1 );
2681+ if (at1 >= '0' && at1 <= '9' ) {
2682+ throw new NumberFormatException ("val [" + val +"] is not a valid number." );
2683+ }
2684+ } else if (initial == '-' && val .length () > 2 ) {
2685+ char at1 = val .charAt (1 );
2686+ char at2 = val .charAt (2 );
2687+ if (at1 == '0' && at2 >= '0' && at2 <= '9' ) {
2688+ throw new NumberFormatException ("val [" + val +"] is not a valid number." );
2689+ }
2690+ }
2691+ }
2692+
2693+ /**
2694+ * Convenience function. Handles val if it is a number
2695+ * @param val value to convert
2696+ * @param initial first char of val
2697+ * @return val as a BigDecimal
2698+ */
2699+ private static Number getNumber (String val , char initial ) {
2700+ // Use a BigDecimal all the time so we keep the original
2701+ // representation. BigDecimal doesn't support -0.0, ensure we
2702+ // keep that by forcing a decimal.
2703+ try {
2704+ BigDecimal bd = new BigDecimal (val );
2705+ if (initial == '-' && BigDecimal .ZERO .compareTo (bd )==0 ) {
2706+ return Double .valueOf (-0.0 );
2707+ }
2708+ return bd ;
2709+ } catch (NumberFormatException retryAsDouble ) {
2710+ // this is to support "Hex Floats" like this: 0x1.0P-1074
2711+ try {
2712+ Double d = Double .valueOf (val );
2713+ if (d .isNaN () || d .isInfinite ()) {
2714+ throw new NumberFormatException ("val [" + val +"] is not a valid number." );
2715+ }
2716+ return d ;
2717+ } catch (NumberFormatException ignore ) {
2718+ throw new NumberFormatException ("val [" + val +"] is not a valid number." );
2719+ }
2720+ }
2721+ }
2722+
26972723 /**
26982724 * Throw an exception if the object is a NaN or infinite number.
26992725 *
@@ -3044,28 +3070,7 @@ public Writer write(Writer writer, int indentFactor, int indent)
30443070 // might throw an exception
30453071 attemptWriteValue (writer , indentFactor , indent , entry , key );
30463072 } else if (length != 0 ) {
3047- final int newIndent = indent + indentFactor ;
3048- for (final Entry <String ,?> entry : this .entrySet ()) {
3049- if (needsComma ) {
3050- writer .write (',' );
3051- }
3052- if (indentFactor > 0 ) {
3053- writer .write ('\n' );
3054- }
3055- indent (writer , newIndent );
3056- final String key = entry .getKey ();
3057- writer .write (quote (key ));
3058- writer .write (':' );
3059- if (indentFactor > 0 ) {
3060- writer .write (' ' );
3061- }
3062- attemptWriteValue (writer , indentFactor , newIndent , entry , key );
3063- needsComma = true ;
3064- }
3065- if (indentFactor > 0 ) {
3066- writer .write ('\n' );
3067- }
3068- indent (writer , indent );
3073+ writeContent (writer , indentFactor , indent , needsComma );
30693074 }
30703075 writer .write ('}' );
30713076 return writer ;
@@ -3074,6 +3079,44 @@ public Writer write(Writer writer, int indentFactor, int indent)
30743079 }
30753080 }
30763081
3082+ /**
3083+ * Convenience function. Writer attempts to write formatted content
3084+ * @param writer
3085+ * Writes the serialized JSON
3086+ * @param indentFactor
3087+ * The number of spaces to add to each level of indentation.
3088+ * @param indent
3089+ * The indentation of the top level.
3090+ * @param needsComma
3091+ * Boolean flag indicating a comma is needed
3092+ * @throws IOException
3093+ * If something goes wrong
3094+ */
3095+ private void writeContent (Writer writer , int indentFactor , int indent , boolean needsComma ) throws IOException {
3096+ final int newIndent = indent + indentFactor ;
3097+ for (final Entry <String ,?> entry : this .entrySet ()) {
3098+ if (needsComma ) {
3099+ writer .write (',' );
3100+ }
3101+ if (indentFactor > 0 ) {
3102+ writer .write ('\n' );
3103+ }
3104+ indent (writer , newIndent );
3105+ final String key = entry .getKey ();
3106+ writer .write (quote (key ));
3107+ writer .write (':' );
3108+ if (indentFactor > 0 ) {
3109+ writer .write (' ' );
3110+ }
3111+ attemptWriteValue (writer , indentFactor , newIndent , entry , key );
3112+ needsComma = true ;
3113+ }
3114+ if (indentFactor > 0 ) {
3115+ writer .write ('\n' );
3116+ }
3117+ indent (writer , indent );
3118+ }
3119+
30773120 /**
30783121 * Convenience function. Writer attempts to write a value.
30793122 * @param writer
0 commit comments