code: public Object parseValue() {
      Object val;
      switch(T.getType()) {
        case LCURLY:
          val = parseObject();
          break;
        case LSQUARE:
          val = parseArray();
          break;
        case INTEGER:
          if(useBig) {
            val = new BigInteger(T.getString());
          } else {
            try {
              val = Integer.parseInt(T.getString());
            } catch(NumberFormatException e0) {
              // we have an overflow, the tokenizer guarantees the format is correct
              try {
                val = Long.parseLong(T.getString());
              } catch(NumberFormatException e1) {
                val = 0;
              }
            }
          }
          advance();
          break;
        case DOUBLE:
          if(useBig) {
            val = new BigDecimal(T.getString());
          } else {
            val = Double.parseDouble(T.getString());
          }
          advance();
          break;
        case STRING:
          val = T.getString();
          advance();
          break;
        case TRUE:
          val = true;
          advance();
          break;
        case FALSE:
          val = false;
          advance();
          break;
        case NULL:
          val = null;
          advance();
          break;
        default:
          val = null;
          addError();
      }
      return val;
    }
docs: value = object | array | number | string | "true" | "false" | "null" .