繁体   English   中英

如何使用GSON解析带有JSON数组的复杂JSON字符串混合?

[英]How to parse complex JSON string mix with JSON Arrays using GSON?

以下是我的JSON字符串,由于要使用它,我尝试使用GSON解析此JSON字符串。

{
"HasChanged":true,
"Version":1,
"LastModifiedDate":1390561121310,
    "DATACENTERS":
        [
            {
            "Name": "DC1",
            "TotalNumberOfServers":4,
            "PrimaryData":[{"0":"1", "1":"2", "2":"3", "3":"4"}],
            "SecondaryData":[{"0":"2", "1":"3", "2":"4", "3":"1"}],
            "MachineMapping":[{"3":"dc11115.dc1.domain.com"}, {"2":"dc11114.dc1.domain.com"}, {"1":"dc11113.dc1.domain.com"}, {"4":"dc11116.dc1.domain.com"}]
            },
            {
            "Name": "DC2",
            "TotalNumberOfServers":4,
            "PrimaryData":[{"1":"1", "5":"2", "2":"3", "6":"4"}],
            "SecondaryData":[{"7":"1", "0":"8", "2":"5", "10":"9"}],
            "MachineMapping":[{"3":"dc21147.dc2.domain.com"}, {"2":"dc21146.dc2.domain.com"}, {"1":"dc21145.dc2.domain.com"}, {"4":"dc21148.dc2.domain.com"}]
            }
        ]
}

解析上述JSON字符串后,我需要将每个DataCenter数据存储在以下数据结构中-

Map<String, Map<String, String>> primaryData
Map<String, Map<String, String>> secondaryData
Map<String, Map<String, String>> machineMapping

对于JSON字符串中的PrimaryData标签,

Here Key of `primaryData` map is `DC1` and value is {"0":"1", "1":"2", "2":"3", "3":"4"} which is for `PrimaryData` tag.
Similarly, another Key of `primaryData` map is `DC2` and value is {"1":"1", "5":"2", "2":"3", "6":"4"} which is for `PrimaryData` tag.

以及JSON String-中的SecondaryData标签

Here Key of `secondaryData` map is `DC1` and value is {"0":"2", "1":"3", "2":"4", "3":"1"} which is for `SecondaryData` tag.
Similarly, another Key of `secondaryData` map is `DC2` and value is {"7":"1", "0":"8", "2":"5", "10":"9"} which is for `SecondaryData` tag.

以及JSON MachineMapping中的MachineMapping标签

Here Key of `machineMapping` is `DC1` and value is {"3":"dc11115.dc1.domain.com"}, {"2":"dc11114.dc1.domain.com"}, {"1":"dc11113.dc1.domain.com"}, {"4":"dc11116.dc1.domain.com"} which is for MachineMapping tag.
Similarly another key of `machineMapping` is `DC2` and value is {"3":"dc21147.dc2.domain.com"}, {"2":"dc21146.dc2.domain.com"}, {"1":"dc21145.dc2.domain.com"}, {"4":"dc21148.dc2.domain.com"} which is for `MachineMapping` tag.

这是我第一次使用此复杂的JSON String进行解析,因此我开始使用GSON,因为我发现使用它非常容易。 到目前为止,这是我已经尝试过的方法,并且能够提取大多数字段,但是不确定如何将PrimaryData对象映射到Map ,然后对其他对象执行相同的操作?

private static Map<String, Map<String, String>> primaryData = new LinkedHashMap<String, Map<String, String>>();
private static Map<String, Map<String, String>> secondaryData = new LinkedHashMap<String, Map<String, String>>();
private static Map<String, Map<String, String>> machineMappedData = new LinkedHashMap<String, Map<String, String>>();

public static void main(String[] args) {

    String jsonLine = "my json string";

    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject jobject = jelement.getAsJsonObject();

    boolean changed = jobject.get("HasChanged").getAsBoolean();
    String timestamp = jobject.get("LastModifiedDate").getAsString();
    String version = jobject.get("Version").getAsString();

    System.out.println(changed);
    System.out.println(timestamp);
    System.out.println(version);

    if (changed) {
        JsonArray jarray = jobject.getAsJsonArray("DATACENTERS");
        for (int i = 0; i < jarray.size(); i++) {
            Map<String, String> data = new LinkedHashMap<String, String>();

            jobject = jarray.get(i).getAsJsonObject();
            String dcName = jobject.get("Name").getAsString();
            int servers = jobject.get("TotalNumberOfServers").getAsInt();
            System.out.println(dcName);
            System.out.println(servers);

            if (servers > 0) {
                JsonArray jarray1 = jobject.getAsJsonArray("PrimaryData");
                System.out.println(jarray1);
                for (int j = 0; j < jarray1.size(); j++) {
                    jobject = jarray1.get(j).getAsJsonObject();
                    System.out.println(jobject);

                    // not sure how to map the PrimaryData object to a Map here?

                }
            }
        }
    }
}

但是我一直卡在上面,不知道如何将JSON对象放在这里的Map中? 谁能帮我这个?

您应该做的是定义JSON映射到的Java类:

public class MyJsonResponse
{
    private boolean HasChanged;
    private int Version;
    private long LastModifiedDate;
    private List<DataCenter> DATACENTERS;

    // Getters/Setters for above
}

public class DataCenter
{
    private String Name;
    private int TotalNumberOfServers;
    private List<Map<String,String>> PrimaryData;
    private List<Map<String,String>> SecondaryData;
    private List<Map<String,String>> MachineMapping; 

    // getters and setters for all of the above
}

定义了这些类后,它很简单:

MyJsonResponse response = new Gson().fromJson(jsonString, MyJsonResponse.class);

另外值得注意的是,由于JSON变量名称不符合Java命名约定,因此您还应该通过@SerializedName批注进行转换。

@SerializedName("DATACENTERS")
private List<DataCenter> dataCenters;

举个例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM