JAVA |反序列化JSON对象与孩子的内心(对象,数组,字符串)

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); 

但它给我这个(见图片),我不能做太多与它:

enter image description here

+0

你使用google.gson库? – nonzaprej

+0

@nonzaprej我只使用杰克逊和org.json进行测试。但我不能做这个,因为它不会自动在整个结构重复。我不知道如何在这里应用递归函数。 – bmvr

我认为最好的方法是使用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); 

     } 

输出:

enter image description here