如何使用GSON解析复杂的JSON字符串与JSON数组混合?(How to parse complex JSON string mix with JSON Arrays using GSON?)

编程入门 行业动态 更新时间:2024-10-26 10:27:21
如何使用GSON解析复杂的JSON字符串与JSON数组混合?(How to parse complex JSON string mix with JSON Arrays using GSON?) java

下面是我的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字符串中的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字符串,所以我开始使用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中? 谁能帮我这个?

Below is my JSON String and I am trying to parse this JSON String using GSON as I am finding it pretty easy to work with.

{ "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"}] } ] }

After parsing the above JSON String, I need to store each DataCenter data in the below data structure -

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

For PrimaryData tag in the JSON String-

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.

And also for SecondaryData tag in the JSON String-

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.

And also for MachineMapping tag in the JSON String-

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.

This is the first time I am working with parsing of this complex JSON String so I started working with GSON as I was finding it pretty easy to work with. This is what I have tried so far and I am able to extract most of the fields but not sure how to map PrimaryData object into a Map and then do the same thing for others?

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? } } } } }

But I have got stuck on it and not sure how do I put the JSON object in a Map here? Can anyone help me with this?

最满意答案

您应该做的是定义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;

举个例子。

What you should be doing is defining Java classes that your JSON maps to:

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 }

With those classes defined, it's as simple as:

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

Also worth noting is that since the JSON variable names don't conform to the Java naming conventions, you should also convert them via the @SerializedName annotation.

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

as an example.

更多推荐

本文发布于:2023-08-06 18:56:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1453773.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   字符串   如何使用   JSON   GSON

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!