# HG changeset patch # User Jaroslav Tulach # Date 1365355795 -7200 # Node ID 28aae214c2028235fb15437e032201c49bf40d45 # Parent 0e2ced48871de3b3c49e7621779cac4d764d3a42 Can parse JSON array with objects in it diff -r 0e2ced48871d -r 28aae214c202 javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java --- a/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Apr 07 19:28:00 2013 +0200 +++ b/javaquery/api/src/main/java/org/apidesign/bck2brwsr/htmlpage/PageProcessor.java Sun Apr 07 19:29:55 2013 +0200 @@ -162,7 +162,8 @@ w.append(" ").append(className).append("(Object json) {\n"); int values = 0; for (int i = 0; i < propsGetSet.size(); i += 4) { - if (propsGetSet.get(i + 2) == null) { + Property p = findProperty(m.properties(), propsGetSet.get(i)); + if (p == null) { continue; } values++; @@ -170,36 +171,45 @@ w.append(" Object[] ret = new Object[" + values + "];\n"); w.append(" org.apidesign.bck2brwsr.htmlpage.ConvertTypes.extractJSON(json, new String[] {\n"); for (int i = 0; i < propsGetSet.size(); i += 4) { - if (propsGetSet.get(i + 2) == null) { + Property p = findProperty(m.properties(), propsGetSet.get(i)); + if (p == null) { continue; } w.append(" \"").append(propsGetSet.get(i)).append("\",\n"); } w.append(" }, ret);\n"); for (int i = 0, cnt = 0, prop = 0; i < propsGetSet.size(); i += 4) { - if (propsGetSet.get(i + 2) == null) { + final String pn = propsGetSet.get(i); + Property p = findProperty(m.properties(), pn); + if (p == null) { continue; } boolean[] isModel = { false }; boolean[] isEnum = { false }; String type = checkType(m.properties()[prop++], isModel, isEnum); - w.append(" this.prop_").append(propsGetSet.get(i)).append(" = "); - boolean close = false; if (isEnum[0]) { // w.append(type).append(".valueOf((String)"); // close = true; - w.append("null;\n"); - continue; + w.append(" this.prop_").append(pn); + w.append(" = null;\n"); + } else if (p.array()) { + w.append("if (ret[" + cnt + "] instanceof Object[]) {\n"); + w.append(" for (Object e : ((Object[])ret[" + cnt + "])) {\n"); + if (isModel[0]) { + w.append(" this.prop_").append(pn).append(".add(new "); + w.append(type).append("(e));\n"); + } else { + w.append(" this.prop_").append(pn).append(".add(("); + w.append(type).append(")e);\n"); + } + w.append(" }\n"); + w.append("}\n"); } else { - w.append('(').append(type).append(')'); + w.append(" this.prop_").append(pn); + w.append(" = (").append(type).append(')'); + w.append("ret[" + cnt + "];\n"); } - w.append("ret[" + cnt++ + "]"); - if (close) { - w.append(");\n"); - } else { - w.append(";\n"); - } - + cnt++; } w.append(" intKnckt();\n"); w.append(" };\n"); @@ -1038,4 +1048,13 @@ pos = close + 1; } } + + private static Property findProperty(Property[] properties, String propName) { + for (Property p : properties) { + if (propName.equals(p.name())) { + return p; + } + } + return null; + } } diff -r 0e2ced48871d -r 28aae214c202 javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java --- a/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Sun Apr 07 19:28:00 2013 +0200 +++ b/javaquery/api/src/test/java/org/apidesign/bck2brwsr/htmlpage/JSONTest.java Sun Apr 07 19:29:55 2013 +0200 @@ -137,6 +137,12 @@ throw new IllegalStateException("Got in array him: " + Arrays.asList(p)); } + @OnReceive(url="/{url}") + static void fetchPeople(People p, JSONik model) { + model.setFetchedCount(p.getInfo().size()); + model.setFetched(p.getInfo().get(0)); + } + @Http(@Http.Resource( content = "{'firstName': 'Sitar', 'sex': 'MALE'}", path="/person.json", @@ -207,6 +213,32 @@ } @Http(@Http.Resource( + content = "{'info':[{'firstName': 'Gitar', 'sex': 'FEMALE'}]}", + path="/people.json", + mimeType = "application/json" + )) + @BrwsrTest public void loadAndParseArrayInPeople() throws InterruptedException { + if (js == null) { + js = new JSONik(); + js.applyBindings(); + + js.fetchPeople("people.json"); + } + + if (0 == js.getFetchedCount()) { + throw new InterruptedException(); + } + + assert js.getFetchedCount() == 1 : "One person loaded: " + js.getFetchedCount(); + + Person p = js.getFetched(); + + assert p != null : "We should get our person back: " + p; + assert "Gitar".equals(p.getFirstName()) : "Expecting Gitar: " + p.getFirstName(); +// assert Sex.MALE.equals(p.getSex()) : "Expecting MALE: " + p.getSex(); + } + + @Http(@Http.Resource( content = "[{'firstName': 'Gitar', 'sex': 'FEMALE'}," + "{'firstName': 'Peter', 'sex': 'MALE'}" + "]",