如何解决Java Gson JSON:序列化包含 List<Map.Entry<...,...>> 的对象
我目前正在尝试使用谷歌 Gson 序列化并正确反序列化一个包含元组列表的对象。我在 here 和 here 处发现了类似的问题,但我无法针对我的问题调整他们的解决方案,因为我的 List 在一个对象中。
这里有一个简单的例子:
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
}
感谢您的帮助。
解决方法
当您重新排列 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;
}
产生这个输出:
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 A=4}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。