docs: @Override
      public final String readSmallString() {
          char ch = nextGoodChar();
          if (ch == 0) return null;
          final StringBuilder sb = new StringBuilder();
          if (ch == '"' || ch == '\'') {
              final char quote = ch;
              for (;;) {
                  ch = nextChar();
                  if (ch == '\\') {
                      char c = nextChar();
                      switch (c) {
                          case '"':
                          case '\'':
                          case '\\':
                          case '/':
                              sb.append(c);
                              break;
                          case 'n':
                              sb.append('\n');
                              break;
                          case 'r':
                              sb.append('\r');
                              break;
                          case 'u':
                              sb.append((char) Integer.parseInt(new String(new char[]{nextChar(), nextChar(), nextChar(), nextChar()}), 16));
                              break;
                          case 't':
                              sb.append('\t');
                              break;
                          case 'b':
                              sb.append('\b');
                              break;
                          case 'f':
                              sb.append('\f');
                              break;
                          default:
                              throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + ")");
                      }
                  } else if (ch == quote || ch == 0) {
                      break;
                  } else {
                      sb.append(ch);
                  }
              }
              return sb.toString();
          } else {
              sb.append(ch);
              for (;;) {
                  ch = nextChar();
                  if (ch == '\\') {
                      char c = nextChar();
                      switch (c) {
                          case '"':
                          case '\'':
                          case '\\':
                          case '/':
                              sb.append(c);
                              break;
                          case 'n':
                              sb.append('\n');
                              break;
                          case 'r':
                              sb.append('\r');
                              break;
                          case 'u':
                              sb.append((char) Integer.parseInt(new String(new char[]{nextChar(), nextChar(), nextChar(), nextChar()}), 16));
                              break;
                          case 't':
                              sb.append('\t');
                              break;
                          case 'b':
                              sb.append('\b');
                              break;
                          case 'f':
                              sb.append('\f');
                              break;
                          default:
                              throw new ConvertException("illegal escape(" + c + ") (position = " + this.position + ")");
                      }
                  } else if (ch == ',' || ch == ']' || ch == '}' || ch <= ' ' || ch == ':') { //  ch <= ' ' 包含 0
                      backChar(ch);
                      break;
                  } else {
                      sb.append(ch);
                  }
              }
              String rs = sb.toString();
              return "null".equalsIgnoreCase(rs) ? null : rs;
          }
      }