JAVA |反序列化JSON对象与孩子的内心(对象,数组,字符串)
问题描述:
我有一个JSON结构是完全动态的,我总是不知道什么结构将来自它。JAVA |反序列化JSON对象与孩子的内心(对象,数组,字符串)
我IDEIA是获得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数据库来分析1M线动态JSON结构。 (我做一个纯粹的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);
但它给我这个(见图片),我不能做太多与它:
答
我认为最好的方法是使用google.gson库和代码,通过使用自定义JsonDeserializer
或自定义TypeAdapter
。你将不得不编写你的具体逻辑来解析json。
这里有一个关于什么是它们之间的区别问题:Gson Type Adapter vs. Custom Deseralizer
这里是一个非常好的教程使用TypeAdapter
S:GSON TYPEADAPTER EXAMPLE
答
我不认为有一个简单的(自动)解决方案,以反序列化动态JSON对象,而不额外的元信息。
我会用JsonReader和自己做
JsonReader reader = Json.createReader(inputStream);
JsonObject object = reader.readObject();
object.get(key) ...
答
一天的工作我finaly实现了目标之后。
这里是一个JSON结构的例子:
{
"Myobj" :
{
"mychild1":"this is my child 1",
"mychild2":"this is my second child",
"Myarr":[3,4,5,6,7],
"mychild3":
{
"myarr2":["A","B","C"],
"myinnerChild2":
{
"key1":"val1",
"key2":"val2"
}
}
}
}
这里它是解析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;
}
这”我的主:
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);
}
输出:
你使用google.gson库? – nonzaprej
@nonzaprej我只使用杰克逊和org.json进行测试。但我不能做这个,因为它不会自动在整个结构重复。我不知道如何在这里应用递归函数。 – bmvr