Skip to content

Commit 3106997

Browse files
author
ColinTree
committed
Version 2: Added support of Parsing Json String / List
& added operations on JsonArray / JsonObject
1 parent 70e74e8 commit 3106997

File tree

5 files changed

+559
-50
lines changed

5 files changed

+559
-50
lines changed

JsonArray.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package cn.colintree.aix.JsonUtils;
2+
3+
import com.google.appinventor.components.runtime.ComponentContainer;
4+
import com.google.appinventor.components.runtime.util.YailList;
5+
6+
import org.json.JSONArray;
7+
import org.json.JSONException;
8+
import org.json.JSONObject;
9+
10+
/**
11+
* A non visible container for JSONArray
12+
*
13+
*/
14+
public final class JsonArray extends JsonType {
15+
16+
public static JsonArray parseJsonArray(YailList list) throws JSONException {
17+
return new JsonArray(parseJSONArray(list));
18+
}
19+
20+
public static JSONArray parseJSONArray(YailList list) throws JSONException {
21+
if (JsonObject.canParseJSONObject(list)) {
22+
throw new IllegalArgumentException();
23+
}
24+
int size = list.size();
25+
JSONArray array = new JSONArray();
26+
Object item;
27+
for (int i = 0; i < size; i++) {
28+
item = list.getObject(i);
29+
array.put(item instanceof YailList
30+
? JsonUtils.List2Json((YailList) item)
31+
: item);
32+
}
33+
return array;
34+
}
35+
36+
private final JSONArray array;
37+
38+
JsonArray(ComponentContainer container) {
39+
this(new JSONArray());
40+
}
41+
JsonArray(JSONArray array) {
42+
super(null);
43+
if (array == null) {
44+
array = new JSONArray();
45+
}
46+
this.array = array;
47+
}
48+
49+
@Override
50+
public String toString() {
51+
return array.toString();
52+
}
53+
54+
public JSONArray getArray() {
55+
return array;
56+
}
57+
58+
@Override
59+
public YailList toList() {
60+
return toList(array);
61+
}
62+
63+
public static YailList toList(JSONArray array) {
64+
int length = array.length();
65+
Object[] objs = new Object[length];
66+
for (int i = 0; i < length; i++) {
67+
objs[i] = array.opt(i);
68+
if (objs[i] instanceof JSONArray) {
69+
objs[i] = JsonArray.toList((JSONArray) objs[i]);
70+
} else if (objs[i] instanceof JSONObject) {
71+
objs[i] = JsonObject.toList((JSONObject) objs[i]);
72+
}
73+
}
74+
return YailList.makeList(objs);
75+
}
76+
77+
}

JsonObject.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package cn.colintree.aix.JsonUtils;
2+
3+
import java.util.Iterator;
4+
5+
import com.google.appinventor.components.runtime.ComponentContainer;
6+
import com.google.appinventor.components.runtime.util.YailList;
7+
8+
import org.json.JSONArray;
9+
import org.json.JSONException;
10+
import org.json.JSONObject;
11+
12+
/**
13+
* A non visible container for JSONObject
14+
*/
15+
public final class JsonObject extends JsonType {
16+
17+
public static JsonObject parseJsonObject(YailList list) throws JSONException {
18+
return new JsonObject(parseJSONObject(list));
19+
}
20+
21+
public static JSONObject parseJSONObject(YailList list) throws JSONException {
22+
if (!canParseJSONObject(list)) {
23+
throw new IllegalArgumentException();
24+
}
25+
int size = list.size();
26+
JSONObject object = new JSONObject();
27+
YailList itemList;
28+
for (int i = 0; i < size; i++) {
29+
itemList = (YailList) list.getObject(i);
30+
object.put(
31+
(String) itemList.getObject(0),
32+
itemList.getObject(1) instanceof YailList
33+
? JsonUtils.List2Json((YailList) itemList.getObject(1))
34+
: itemList.getObject(1)
35+
);
36+
}
37+
return object;
38+
}
39+
40+
public static boolean canParseJSONObject(YailList list) {
41+
int size = list.size();
42+
Object item;
43+
for (int i = 0; i < size; i++) {
44+
item = list.getObject(i);
45+
if (item instanceof YailList && ((YailList)item).size() == 2
46+
&& ((YailList)item).getObject(0) instanceof String) {
47+
// this item is a valid object item
48+
} else {
49+
return false;
50+
}
51+
}
52+
return true;
53+
}
54+
55+
56+
private final JSONObject object;
57+
58+
JsonObject(ComponentContainer container) {
59+
this(new JSONObject());
60+
}
61+
JsonObject(JSONObject object) {
62+
super(null);
63+
this.object = object;
64+
}
65+
66+
@Override
67+
public String toString() {
68+
return object.toString();
69+
}
70+
71+
public JSONObject getObject() {
72+
return object;
73+
}
74+
75+
@Override
76+
public YailList toList() {
77+
return toList(object);
78+
}
79+
80+
public static YailList toList(JSONObject object) {
81+
int length = object.length();
82+
Object[] objs = new Object[length];
83+
int i = 0;
84+
String key;
85+
Object value;
86+
Iterator<String> iterator = object.keys();
87+
while (iterator.hasNext()) {
88+
key = iterator.next();
89+
value = object.opt(key);
90+
if (value instanceof JSONArray) {
91+
value = JsonArray.toList((JSONArray) value);
92+
} else if (value instanceof JSONObject) {
93+
value = JsonObject.toList((JSONObject) value);
94+
}
95+
objs[i] = YailList.makeList(new Object[]{ key, value });
96+
i++;
97+
}
98+
return YailList.makeList(objs);
99+
}
100+
101+
}

JsonType.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package cn.colintree.aix.JsonUtils;
2+
3+
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
4+
import com.google.appinventor.components.runtime.ComponentContainer;
5+
import com.google.appinventor.components.runtime.util.YailList;
6+
7+
public abstract class JsonType extends AndroidNonvisibleComponent {
8+
9+
public JsonType(ComponentContainer container) {
10+
super(null);
11+
}
12+
13+
@Override
14+
public abstract String toString();
15+
16+
public abstract YailList toList();
17+
18+
}

0 commit comments

Comments
 (0)