class JsonMLUtil {
private static JsonML parseElement(JSONArray element)
throws Exception {
JsonML jsonMLElement = new JsonML(TagType.valueOf(element.getString(0)));
// set attributes for the JsonML element
JSONObject attrs = element.getJSONObject(1);
Iterator<?> it = attrs.keys();
while (it.hasNext()) {
String key = (String) it.next();
Object value = attrs.get(key);
TagAttr tag = TagAttr.get(key);
// an unsupported attribute
if (tag == null) {
continue;
}
if (value instanceof Number) {
value = ((Number) value).doubleValue();
}
switch (tag) {
case NAME:
case BODY:
case FLAGS:
case OP:
case TYPE:
case IS_PREFIX:
case LABEL:
jsonMLElement.setAttribute(tag, value);
break;
case VALUE:
// we do not want to deal with JSONObject.NULL
if (value != null && value.equals(null)) {
value = null;
}
// we want all numbers to be stored as double values
if (value instanceof Number) {
jsonMLElement.setAttribute(tag, ((Number) value).doubleValue());
} else {
jsonMLElement.setAttribute(tag, value);
}
break;
default:
}
}
// recursively set children for the JsonML element
for (int i = 2; i < element.length(); ++i) {
jsonMLElement.appendChild(parseElement(element.getJSONArray(i)));
}
return jsonMLElement;
}
}