ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/LoadJSON.java
branchJsonArray
changeset 745 4f12b1d9c695
parent 551 7ca2253fa86d
child 749 18514ccc3ed1
     1.1 --- a/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/LoadJSON.java	Fri Feb 07 07:44:34 2014 +0100
     1.2 +++ b/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/LoadJSON.java	Tue Jul 22 17:55:18 2014 +0200
     1.3 @@ -123,43 +123,15 @@
     1.4              final PushbackInputStream is = new PushbackInputStream(
     1.5                  conn.getInputStream(), 1
     1.6              );
     1.7 -            boolean array = false;
     1.8 -            boolean string = false;
     1.9 -            if (call.isJSONP()) {
    1.10 -                for (;;) {
    1.11 -                    int ch = is.read();
    1.12 -                    if (ch == -1) {
    1.13 -                        break;
    1.14 -                    }
    1.15 -                    if (ch == '[') {
    1.16 -                        is.unread(ch);
    1.17 -                        array = true;
    1.18 -                        break;
    1.19 -                    }
    1.20 -                    if (ch == '{') {
    1.21 -                        is.unread(ch);
    1.22 -                        break;
    1.23 -                    }
    1.24 -                }
    1.25 -            } else {
    1.26 -                int ch = is.read();
    1.27 -                if (ch == -1) {
    1.28 -                    string = true;
    1.29 -                } else {
    1.30 -                    array = ch == '[';
    1.31 -                    is.unread(ch);
    1.32 -                    if (!array && ch != '{') {
    1.33 -                        string = true;
    1.34 -                    }
    1.35 -                }
    1.36 -            }
    1.37 +            boolean[] arrayOrString = { false, false };
    1.38 +            detectJSONType(call.isJSONP(), is, arrayOrString);
    1.39              try {
    1.40 -                if (string) {
    1.41 +                if (arrayOrString[1]) {
    1.42                      throw new JSONException("");
    1.43                  }
    1.44                  JSONTokener tok = createTokener(is);
    1.45                  Object obj;
    1.46 -                obj = array ? new JSONArray(tok) : new JSONObject(tok);
    1.47 +                obj = arrayOrString[0] ? new JSONArray(tok) : new JSONObject(tok);
    1.48                  json = convertToArray(obj);
    1.49              } catch (JSONException ex) {
    1.50                  Reader r = new InputStreamReader(is, "UTF-8");
    1.51 @@ -184,6 +156,34 @@
    1.52          }
    1.53      }
    1.54  
    1.55 +    private static void detectJSONType(boolean skipAnything, final PushbackInputStream is, boolean[] arrayOrString) throws IOException {
    1.56 +        for (;;) {
    1.57 +            int ch = is.read();
    1.58 +            if (ch == -1) {
    1.59 +                arrayOrString[1] = true;
    1.60 +                break;
    1.61 +            }
    1.62 +            if (Character.isWhitespace(ch)) {
    1.63 +                continue;
    1.64 +            }
    1.65 +
    1.66 +            if (ch == '[') {
    1.67 +                is.unread(ch);
    1.68 +                arrayOrString[0] = true;
    1.69 +                break;
    1.70 +            }
    1.71 +            if (ch == '{') {
    1.72 +                is.unread(ch);
    1.73 +                break;
    1.74 +            }
    1.75 +            if (!skipAnything) {
    1.76 +                is.unread(ch);
    1.77 +                arrayOrString[1] = true;
    1.78 +                break;
    1.79 +            }
    1.80 +        }
    1.81 +    }
    1.82 +
    1.83      private static JSONTokener createTokener(InputStream is) throws IOException {
    1.84          Reader r = new InputStreamReader(is, "UTF-8");
    1.85          try {
    1.86 @@ -252,8 +252,12 @@
    1.87      
    1.88      public static Object parse(InputStream is) throws IOException {
    1.89          try {
    1.90 -            JSONTokener t = createTokener(is);
    1.91 -            return new JSONObject(t);
    1.92 +            PushbackInputStream push = new PushbackInputStream(is, 1);
    1.93 +            boolean[] arrayOrString = { false, false };
    1.94 +            detectJSONType(false, push, arrayOrString);
    1.95 +            JSONTokener t = createTokener(push);
    1.96 +            Object obj = arrayOrString[0] ? new JSONArray(t) : new JSONObject(t);
    1.97 +            return convertToArray(obj);
    1.98          } catch (JSONException ex) {
    1.99              throw new IOException(ex);
   1.100          }