}
private JsonInput deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException {
JsonInput wrapper = new JsonInput();
if (json.isJsonObject()) {
JsonObject obj = json.getAsJsonObject();
for (Entry<String, JsonElement> entry : obj.entrySet()) {
String key = entry.getKey();
JsonElement elem = entry.getValue();
// static mapping of IdProperty if present
if ((idProperty != null) && "id".equals(key)) {
key = idProperty.jsonName();
}
if (elem.isJsonNull()) {
wrapper.add(key, null);
} else if (elem.isJsonObject()) {
wrapper.add(key, deserialize(elem, context));
} else if (elem.isJsonArray()) {
JsonArray array = elem.getAsJsonArray();
List list = new LinkedList();
for(JsonElement element : array) {
if (element.isJsonPrimitive()) {
list.add(fromPrimitive((element.getAsJsonPrimitive())));
} else if(element.isJsonObject()) {
// create map of values
list.add(deserialize(element, context));
}
}
wrapper.add(key, list);
} else if (elem.isJsonPrimitive()) {
// wrapper.add(key, elem.getAsString());
wrapper.add(key, fromPrimitive(elem.getAsJsonPrimitive()));
}
}
} else if(json.isJsonArray()) {
JsonArray array = json.getAsJsonArray();
for(JsonElement elem : array) {
wrapper = new JsonInput();
if (elem.isJsonPrimitive()) {
wrapper.add(elem.toString(), fromPrimitive(elem.getAsJsonPrimitive()));
} else if(elem.isJsonObject()) {
wrapper.add(elem.toString(), deserialize(elem, context));
} else if(elem.isJsonArray()) {
wrapper.add(elem.toString(), deserialize(elem, context));
}
}
}
return wrapper;