我有一个完全动态的JSON结构,我并不总是知道它会有什么结构。
我的意思是获得一个LinkedList<Class>
的PATH和VALUE,例如
Root.Parent1.child1.Property1, Value
Root.Parent1.child1.Property2, Value
Root.Parent1.child2.Property1, Value
Root.Parent2.Array[0], Value
Root.Parent2.Array[1], Value
等等。
稍后我将在Oracle DB中使用此函数来解析具有动态json结构的1M行。 (我已经完成了纯PL / SQL功能,但速度非常慢)
如何更深入地了解JSON结构?我可以使用递归函数吗?
[被修改]
到目前为止,我已经完成了以下测试:
String str = "{ \"ProcessData\": { \"addressID\": \"1-61U0RR\"......"; // big json
Object object = new JSONObject(str);
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> mappedObject = mapper.readValue(str, Map.class);
但它给了我这个(见图)我对它无能为力:
答案 0 :(得分:0)
我认为您最好的选择是使用google.gson库并编写自定义JsonDeserializer
或自定义TypeAdapter
的代码。你必须编写你的特定逻辑来解析json
这是一个关于它们之间区别的问题:Gson Type Adapter vs. Custom Deseralizer
这是使用TypeAdapter
的非常好的教程:GSON TYPEADAPTER EXAMPLE
答案 1 :(得分:0)
我不认为有一个简单的(自动)解决方案来反序列化动态json对象而无需额外的元信息。
我会使用JsonReader并自己动手
while
答案 2 :(得分:0)
经过一天的工作,我最终实现了目标。
以下是JSON结构的示例:
public static Map<String, String> parse(Object json, Map<String, String> out, String arr_index, String root) throws JSONException {
Class type = json.getClass();
Iterator<String> keys = null;
switch (type.getName()) {
case "org.json.JSONObject":
keys = ((JSONObject) json).keys();
while (keys.hasNext()) {
String key = keys.next();
String val = null;
Object value = ((JSONObject) json).get(key);
if (value.getClass().getName().equals("org.json.JSONObject") || value.getClass().getName().equals("org.json.JSONArray")) {
String obj_key = root + "." + key;
parse(value, out, null, obj_key);
} else if (value.getClass().getName().equals("java.lang.String")) {
val = ((JSONObject) json).getString(key);
}
if (val != null) {
key = (arr_index == null) ? key : key + "[" + arr_index + "]";
root = root + "." + key;
out.put(root, val);
root = root.replace("." + key, "");
}
}
break;
case "org.json.JSONArray":
JSONArray jArr = ((JSONArray) json);
for (int i = 0; i < jArr.length(); i++) {
Object val = jArr.get(i);
parse(val, out, Integer.toString(i), root);
}
break;
default:
String key = (arr_index == null) ? root : root + "[" + arr_index + "]";
out.put(key, json.toString());
break;
}
return out;
}
这是解析json的函数:
public static void main(String[] args) {
String str = "(...)"; //json string
JSONObject object = new JSONObject(str);
Iterator<String> keys = object.keys();
Map<String, String> out = new HashMap<String, String>();
while (keys.hasNext()) {
String key = keys.next();
JSONObject info = object.getJSONObject(key);
parse(info, out, null, key);
}
for (String name : out.keySet()) {
String key = name.toString().replace(".","/");
String value = out.get(name).toString();
System.out.println(key + "->" + value);
}
这是'我的主要:
'cubic'
输出: