Java 哈希映射的Gson序列化

Java 哈希映射的Gson序列化,java,serialization,gson,Java,Serialization,Gson,我有一个需要序列化的hashmap(Map),目前只处理字符串。 当前使用gson对其进行序列化 {cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={tz:“eeee”dis:“aaaa”geoAddr:“cccc,dddd”id:@cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58地质状态:“dddd”区域:1000平方英尺地质城市:“cccc”BBBBBB} 但似乎通过添加中间键值对和如下所示的哈希代码来改变整体结构 {“cb9b4b3d-8d

我有一个需要序列化的hashmap(Map),目前只处理字符串。 当前使用gson对其进行序列化

{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={tz:“eeee”dis:“aaaa”geoAddr:“cccc,dddd”id:@cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58地质状态:“dddd”区域:1000平方英尺地质城市:“cccc”BBBBBB}

但似乎通过添加中间键值对和如下所示的哈希代码来改变整体结构

{“cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58:{“地图”:{“tz”:{“val”:“eeee”},“dis”:{“val”:“aaaa”},“geoAddr”:{“val”:“cccc,dddd”},“id”:{“val”:“cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58”},“地质状态”:{“val”:“dddd”},“区域”{“val”:“1000.0”,单位为“ft²},“geoCity”cccc,{“cb9b4b3d”}

当我将其反序列化回Map时,我最终得到了额外的键值对

Gson gson = new Gson();
Type listType = new TypeToken<Map<String, Map>>()
{
}.getType();
map = gson.fromJson(string, listType); 
Gson-Gson=new-Gson();
类型listType=新类型令牌()
{
}.getType();
map=gson.fromJson(字符串,listType);
{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={map={tz={val=eeee},dis={val=aaaa},geoAddr={val=cccc,dddddd},id={val=cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58},geoState={val=ddddd},area={val=1000.0,unit=ft²},geoCity={val=cccc},bbbb,hashCode=0}

是否有一种方法可以将文件反序列化为与最初相同的结构。我使用的第三方库不理解此反序列化映射。

这对我有用(gson 2.8):


您使用的是什么版本的gson?我用2.8测试了这个,它用原语值序列化了映射。你序列化的是什么
map
类?我也用2.8,序列化/反序列化都很有效。但是反序列化的映射看起来与我最初拥有的不同,如问题中所述。它是一个映射具体实现是什么(即它是一个
HashMap
还是其他什么)?当我使用
HashMap
进行测试时,我没有看到这种行为。谢谢你的建议。我尝试过,但结果相同。关于hashmap中对象的类型,我不正确。在我的例子中,它确实是抽象类的许多具体实现之一。
Gson gson = new Gson();
Type listType = new TypeToken<Map<String, Map>>()
{
}.getType();
map = gson.fromJson(string, listType); 
public static void main(String[] args) {
    String json = "{"
        + "  \"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58\": {"
        + "    \"tz\": \"eeee\","
        + "    \"dis\": \"aaaa\","
        + "    \"geoAddr\": \"cccc\","
        + "    \"id\": \"cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58\","
        + "    \"geoState\": \"dddd\","
        + "    \"area\": 1000,"
        + "    \"geoCity\": \"cccc\""
        + "  }"
        + "}";

    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    Map<String, Map<String, Object>> map = gson.fromJson(json, new TypeToken<Map<String, Map<String, Object>>>(){}.getType());
    System.out.println("Map.toString() is:");
    System.out.println(map);
    String serialisedMap = gson.toJson(map);
    System.out.println("Map to json is:");
    System.out.println(serialisedMap);
}
Map.toString() is:
{cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58={tz=eeee, dis=aaaa, geoAddr=cccc, id=cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58, geoState=dddd, area=1000.0, geoCity=cccc}}
Map to json is:
{
  "cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58": {
    "tz": "eeee",
    "dis": "aaaa",
    "geoAddr": "cccc",
    "id": "cb9b4b3d-8d2e-41b2-9a21-1657dbd14f58",
    "geoState": "dddd",
    "area": 1000.0,
    "geoCity": "cccc"
  }
}