Can parse JSON array with objects in it model
authorJaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 07 Apr 2013 19:29:55 +0200
branchmodel
changeset 94328aae214c202
parent 942 0e2ced48871d
child 944 1e2b0dcc8326
Can parse JSON array with objects in it
javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java
javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java
     1.1 --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Apr 07 19:28:00 2013 +0200
     1.2 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java	Sun Apr 07 19:29:55 2013 +0200
     1.3 @@ -162,7 +162,8 @@
     1.4                  w.append("  ").append(className).append("(Object json) {\n");
     1.5                  int values = 0;
     1.6                  for (int i = 0; i < propsGetSet.size(); i += 4) {
     1.7 -                    if (propsGetSet.get(i + 2) == null) {
     1.8 +                    Property p = findProperty(m.properties(), propsGetSet.get(i));
     1.9 +                    if (p == null) {
    1.10                          continue;
    1.11                      }
    1.12                      values++;
    1.13 @@ -170,36 +171,45 @@
    1.14                  w.append("    Object[] ret = new Object[" + values + "];\n");
    1.15                  w.append("    org.apidesign.bck2brwsr.htmlpage.ConvertTypes.extractJSON(json, new String[] {\n");
    1.16                  for (int i = 0; i < propsGetSet.size(); i += 4) {
    1.17 -                    if (propsGetSet.get(i + 2) == null) {
    1.18 +                    Property p = findProperty(m.properties(), propsGetSet.get(i));
    1.19 +                    if (p == null) {
    1.20                          continue;
    1.21                      }
    1.22                      w.append("      \"").append(propsGetSet.get(i)).append("\",\n");
    1.23                  }
    1.24                  w.append("    }, ret);\n");
    1.25                  for (int i = 0, cnt = 0, prop = 0; i < propsGetSet.size(); i += 4) {
    1.26 -                    if (propsGetSet.get(i + 2) == null) {
    1.27 +                    final String pn = propsGetSet.get(i);
    1.28 +                    Property p = findProperty(m.properties(), pn);
    1.29 +                    if (p == null) {
    1.30                          continue;
    1.31                      }
    1.32                      boolean[] isModel = { false };
    1.33                      boolean[] isEnum = { false };
    1.34                      String type = checkType(m.properties()[prop++], isModel, isEnum);
    1.35 -                    w.append("    this.prop_").append(propsGetSet.get(i)).append(" = ");
    1.36 -                    boolean close = false;
    1.37                      if (isEnum[0]) {
    1.38  //                        w.append(type).append(".valueOf((String)");
    1.39  //                        close = true;
    1.40 -                        w.append("null;\n");
    1.41 -                        continue;
    1.42 +                        w.append("    this.prop_").append(pn);
    1.43 +                        w.append(" = null;\n");
    1.44 +                    } else if (p.array()) {
    1.45 +                        w.append("if (ret[" + cnt + "] instanceof Object[]) {\n");
    1.46 +                        w.append("  for (Object e : ((Object[])ret[" + cnt + "])) {\n");
    1.47 +                        if (isModel[0]) {
    1.48 +                            w.append("    this.prop_").append(pn).append(".add(new ");
    1.49 +                            w.append(type).append("(e));\n");
    1.50 +                        } else {
    1.51 +                            w.append("    this.prop_").append(pn).append(".add((");
    1.52 +                            w.append(type).append(")e);\n");
    1.53 +                        }
    1.54 +                        w.append("  }\n");
    1.55 +                        w.append("}\n");
    1.56                      } else {
    1.57 -                        w.append('(').append(type).append(')');
    1.58 +                        w.append("    this.prop_").append(pn);
    1.59 +                        w.append(" = (").append(type).append(')');
    1.60 +                        w.append("ret[" + cnt + "];\n");
    1.61                      }
    1.62 -                    w.append("ret[" + cnt++ + "]");
    1.63 -                    if (close) {
    1.64 -                        w.append(");\n");
    1.65 -                    } else {
    1.66 -                        w.append(";\n");
    1.67 -                    }
    1.68 -                    
    1.69 +                    cnt++;
    1.70                  }
    1.71                  w.append("    intKnckt();\n");
    1.72                  w.append("  };\n");
    1.73 @@ -1038,4 +1048,13 @@
    1.74              pos = close + 1;
    1.75          }
    1.76      }
    1.77 +
    1.78 +    private static Property findProperty(Property[] properties, String propName) {
    1.79 +        for (Property p : properties) {
    1.80 +            if (propName.equals(p.name())) {
    1.81 +                return p;
    1.82 +            }
    1.83 +        }
    1.84 +        return null;
    1.85 +    }
    1.86  }
     2.1 --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java	Sun Apr 07 19:28:00 2013 +0200
     2.2 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java	Sun Apr 07 19:29:55 2013 +0200
     2.3 @@ -137,6 +137,12 @@
     2.4          throw new IllegalStateException("Got in array him: " + Arrays.asList(p));
     2.5      }
     2.6      
     2.7 +    @OnReceive(url="/{url}")
     2.8 +    static void fetchPeople(People p, JSONik model) {
     2.9 +        model.setFetchedCount(p.getInfo().size());
    2.10 +        model.setFetched(p.getInfo().get(0));
    2.11 +    }
    2.12 +    
    2.13      @Http(@Http.Resource(
    2.14          content = "{'firstName': 'Sitar', 'sex': 'MALE'}", 
    2.15          path="/person.json", 
    2.16 @@ -207,6 +213,32 @@
    2.17      }
    2.18      
    2.19      @Http(@Http.Resource(
    2.20 +        content = "{'info':[{'firstName': 'Gitar', 'sex': 'FEMALE'}]}", 
    2.21 +        path="/people.json", 
    2.22 +        mimeType = "application/json"
    2.23 +    ))
    2.24 +    @BrwsrTest public void loadAndParseArrayInPeople() throws InterruptedException {
    2.25 +        if (js == null) {
    2.26 +            js = new JSONik();
    2.27 +            js.applyBindings();
    2.28 +        
    2.29 +            js.fetchPeople("people.json");
    2.30 +        }
    2.31 +        
    2.32 +        if (0 == js.getFetchedCount()) {
    2.33 +            throw new InterruptedException();
    2.34 +        }
    2.35 +
    2.36 +        assert js.getFetchedCount() == 1 : "One person loaded: " + js.getFetchedCount();
    2.37 +        
    2.38 +        Person p = js.getFetched();
    2.39 +        
    2.40 +        assert p != null : "We should get our person back: " + p;
    2.41 +        assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName();
    2.42 +//        assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex();
    2.43 +    }
    2.44 +    
    2.45 +    @Http(@Http.Resource(
    2.46          content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'},"
    2.47          + "{'firstName': 'Peter', 'sex': 'MALE'}"
    2.48          + "]",