docs: static public Object stringToValue(String s) {
          if (s.equals("")) {
              return s;
          }
          if (s.equalsIgnoreCase("true")) {
              return Boolean.TRUE;
          }
          if (s.equalsIgnoreCase("false")) {
              return Boolean.FALSE;
          }
          if (s.equalsIgnoreCase("null")) {
              return JSONObject.NULL;
          }
  
          /*
           * If it might be a number, try converting it.
           * We support the non-standard 0x- convention.
           * If a number cannot be produced, then the value will just
           * be a string. Note that the 0x-, plus, and implied string
           * conventions are non-standard. A JSON parser may accept
           * non-JSON forms as long as it accepts all correct JSON forms.
           */
  
          char b = s.charAt(0);
          if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') {
              if (b == '0' && s.length() > 2 &&
                          (s.charAt(1) == 'x' || s.charAt(1) == 'X')) {
                  try {
                      return new Integer(Integer.parseInt(s.substring(2), 16));
                  }
                  catch (Exception ignore) {
                  }
              }
              try {
                  if (s.indexOf('.') > -1 ||
                          s.indexOf('e') > -1 || s.indexOf('E') > -1) {
                      return Double.valueOf(s);
                  }
                  else {
                      Long myLong = new Long(s);
                      if (myLong.longValue() == myLong.intValue()) {
                          return new Integer(myLong.intValue());
                      }
                      return myLong;
                  }
              }
              catch (Exception ignore) {
              }
          }
          return s;
      }