[英]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.