JSON formatting for a Java Server

后端 未结 3 833
自闭症患者
自闭症患者 2021-01-26 23:55

I am trying to read JSON string using gson into a Java program. In the sample code below - the Java program has 3 object classes. The data in the json string will have a vari

3条回答
  •  礼貌的吻别
    2021-01-27 00:32

    Your JSON-string seems incorrect to me. Let me propose the following:

    public static void main(String args[]) {
        String jsonstring = "["
            + "{'TableA':[{'field_A1':'A_11'},{'field_A1':'A_12'}]}"
            + ",{'TableB':[{'field_B1':'B_11','field_B2':'B_12','field_B3':['abc','def','ghi']},"
            + "{'field_B1':'B_21','field_B2':'B_Field22','field_B3':['mno','pqr','xyz']}]}"
            + ",{'TableC':[{'field_C1':'C_11','field_C2':'C_12','field_C3':'C_13'},"
            + "{'field_C1':'C_21','field_C2':'C_22','field_C3':'C_23'},{'field_C1':'C_31','field_C2':'C_32','field_C3':'C_33'}]}"
            + "]";
        jsonstring = jsonstring.replace('\'', '"');
    
        Gson gson = new Gson();
        JsonParser parser = new JsonParser();
        JsonArray array = parser.parse(jsonstring).getAsJsonArray();
    
        for (JsonElement jsonElement : array) {
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            Map.Entry table = jsonObject.entrySet().iterator().next();
            String tableName = table.getKey();
            JsonElement rows = table.getValue();
            try {
                Class rowClass = Class.forName("[Lnewpackage." + tableName + ";"); // explanation see below this code snippet
                // rowClass is an array class!
                Object[] parsedRows = gson.fromJson(rows, rowClass);
                // do something with parsedRows
                for (Object x : parsedRows) {
                    System.out.println(x);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    

    Assuming a "table definition" consists of a property named as the class ob the objects in the table, with the objects as array value of that property.

    Explanation of Class.forName("[Lnewpackage." + tableName + ";")

    This retrieves the Class instance for the array type of a class located in the package newpackage, e.g. newpackage.TableA[] (note the []). Class.forName("A") returns the instance representing the class A. Class.forName("[LA;") returns the instance representing the "class" of an array of As. Using it as a parameter for fromJson(...) it results in the parsing of a JSON array of A-objects.

提交回复
热议问题