[英]Java Gson JSON: Serializing an Object which contains a List<Map.Entry<...,...>>
我目前正在嘗試序列化並正確反序列化一個 Object,其中包含一個使用 googles Gson 的帶有元組的列表。 我在這里和這里發現了類似的問題,但我無法調整他們的解決方案來解決我的問題,因為我的列表在 Object 中。
這里有一個簡單的例子:
import com.google.gson.*;
import java.util.*;
public class SerializeTheCity {
public static void main(String[] args) {
HashMap <String, Integer> cityMap = new HashMap <>();
cityMap.put("Street A", 4);
cityMap.put("Street B", 3);
cityMap.put("Street C", 7);
cityMap.put("Street D", 8);
cityMap.put("Street E", 9);
City someCity = new City();
someCity.streets= new ArrayList<>();
someCity.streets.addAll(cityMap.entrySet());
System.out.println(someCity.streets.get(1).getValue()); //works fine, how do I serialize it?
Gson gson = new Gson();
String saveCity = gson.toJson(someCity);
System.out.println(saveCity); //does not work (empty List)
// here I tried to use a solution [link 1] that worked for a similar question.
Gson gson2 = new Gson();
JsonElement jsonTree = gson2.toJsonTree(cityMap, Map.class);
JsonObject jsonObject = new JsonObject();
jsonObject.add("city", jsonTree);
System.out.println("city = "+jsonObject); //how do I deserialize this into an object of city?
City thisCity = gson.fromJson(jsonObject, City.class);
System.out.println("streets = "+thisCity.streets); // doesnt work
//works like in [link 1]. But its not a city-object.
HashMap <String, Integer> thisStreets = gson.fromJson(jsonObject.get("city"), HashMap.class);
System.out.println("this streets = "+thisStreets);
System.out.println("is this street A?"+thisStreets.get("Street A"));
// this works, but I would like having the streets
//in a city object (I could build a new city object like "newCity.streets=thisStreets",
//but perhaps you know a smarter solution)
}
}
class City {
List<Map.Entry<String,Integer>> streets; //Street, HouseNumber
}
謝謝您的幫助。
然后你需要創建新城市並設置街道。 因為基本上當你反序列化的時候,它不對應你的 City object 數據結構。
City city = new City();
city.streets = new ArrayList();
city.streets.addAll(thisStreets);
當您重新排列streets
持有的類型時,您只是混淆了 GSON。 您已經創建了 HashMap,但隨后將街道鍵入為 Map.Entry。
如果您只是簡單地將streets
輸入為 HashMap,它的原生類型,那么一切正常。
兩個變化:
List.of(cityMap);
使用 HashMap 列表設置streets
streets
的聲明更改為List<HashMap<String,Integer>> streets;
這兩個簡單的更改為您解決了它:
public class Main {
public static void main(String[] args) {
HashMap < String, Integer > cityMap = new HashMap < > ();
cityMap.put("Street A", 4);
cityMap.put("Street B", 3);
cityMap.put("Street C", 7);
cityMap.put("Street D", 8);
cityMap.put("Street E", 9);
City someCity = new City();
// Don't do this
// someCity.streets = new ArrayList<>>();
// someCity.streets.addAll(cityMap.entrySet());
// Do this instead
someCity.streets = List.of(cityMap);
System.out.printf("Streets in City Object: %s%n", someCity.streets);
Gson gson = new Gson();
String saveCity = gson.toJson(someCity);
System.out.printf("Serialized City (JSON): %s%n", saveCity);
City otherCity = gson.fromJson(saveCity, City.class);
System.out.printf("Streets in DESERIALIZED City Object: %s%n", someCity.streets);
}
}
class City {
// Use a HashMap
List < HashMap < String, Integer >> streets;
}
產生這個 output:
Streets in City Object: [{Street E=9, Street D=8, Street C=7, Street B=3, Street A=4}]
Serialized City (JSON): {"streets":[{"Street E":9,"Street D":8,"Street C":7,"Street B":3,"Street A":4}]}
Streets in DESERIALIZED City Object: [{Street E=9, Street D=8, Street C=7, Street B=3, Street A=4}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.