JAVA |使用内部子项(对象,数组,字符串)反序列化JSON对象

时间:2017-05-03 11:50:22

标签: java json oracle json-deserialization

我有一个完全动态的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);

但它给了我这个(见图)我对它无能为力:

enter image description here

3 个答案:

答案 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'

输出:

enter image description here