Map为什么要单独写?
因为Map有一些奇怪的表现
Map<String,Object>序列化
Map<Object,String>序列化
的结果是不一样,我们先看第一个
static Gson sGson;
static Gson getGson() {
if (sGson == null) {
sGson = getGsonBuilder().create();
}
return sGson;
}
private static GsonBuilder getGsonBuilder() {
return new GsonBuilder();
}
public static void main(String[] args) {
testMap();
}
private static void testMap(){
Map<String,Empolyee> map = new HashMap<>();
for (int i =0;i<3;i++) {
map.put(""+i, new Empolyee("longxia", i, 10d + i));
}
String result = getGson().toJson(map);
System.out.println(result);
result = getGson().toJson(map,map.getClass());
System.out.println(result);
result = getGson().toJson(map,new TypeToken<Map<String,Empolyee>>(){}.getType());
System.out.println(result);
}
输出结果为:
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
生成的并不是一个数组,而是一个JSON串。
那我们试下加上enableComplexMapKeySerialization() 方法后
private static GsonBuilder getGsonBuilder() {
return new GsonBuilder().enableComplexMapKeySerialization();
}
输出结果
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
发现加不加enableComplexMapKeySerialization()方法对Map<String,Object>并没有影响。
接下来我们查看Map<Object,String>
private static GsonBuilder getGsonBuilder() {
return new GsonBuilder().enableComplexMapKeySerialization();
}
private static void testMap2() {
Map<Empolyee, String> map = new HashMap<>();
for (int i = 0; i < 3; i++) {
map.put(new Empolyee("longxia", i, 10d + i), "" + i);
}
String result = getGson().toJson(map);
System.out.println(result);
result = getGson().toJson(map, map.getClass());
System.out.println(result);
result = getGson().toJson(map, new TypeToken<Map<Empolyee, String>>() {
}.getType());
System.out.println(result);
}
输出结果为
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
诶?这里怎么就变成JSON数组了呢?同时必须加enableComplexMapKeySerialization()方法,否则会是他的内存地址如下:
{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}
{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}
{"com.company.util.GsonUtil$Empolyee@721e0f4f":"1","com.company.util.GsonUtil$Empolyee@28864e92":"2","com.company.util.GsonUtil$Empolyee@546a03af":"0"}
所以这里面有两个问题:
1.为什么Map<String,Object>序列化和Map<Object,String>序列化表现的不一样?
Map<String,Object>序列化会将对象序列化为josn串,但是Map<Object,String>会将对象序列化为多维数组?
2.enableComplexMapKeySerialization()的作用是什么?
现在我们继续查看反序列化
我们先试下这种字符串
{"0":{"name":"longxia","department":0.0,"score":10.0},"1":{"name":"longxia","department":1.0,"score":11.0},"2":{"name":"longxia","department":2.0,"score":12.0}}
代码如下:
private static void testDesMap(){
String srcJson = "{\"0\":{\"name\":\"longxia\",\"department\":0.0,\"score\":10.0},"
+ "\"1\":{\"name\":\"longxia\",\"department\":1.0,\"score\":11.0},"
+ "\"2\":{\"name\":\"longxia\",\"department\":2.0,\"score\":12.0}}";
Map<String,Empolyee> map = new HashMap<>();
map = getGson().fromJson(srcJson,map.getClass());
for (Map.Entry<String,Empolyee> entity : map.entrySet()){
System.out.println(entity.getKey()+" "+entity.getValue());
}
}
输出代码
0 {name=longxia, department=0.0, score=10.0}
1 {name=longxia, department=1.0, score=11.0}
2 {name=longxia, department=2.0, score=12.0}
若是Map<Object,String>呢
原Json为:
[[{"name":"longxia","department":1.0,"score":11.0},"1"],[{"name":"longxia","department":2.0,"score":12.0},"2"],[{"name":"longxia","department":0.0,"score":10.0},"0"]]
测试代码:
private static void testDesMap2(){
String srcJson = "[[{\"name\":\"longxia\",\"department\":1.0,\"score\":11.0},\"1\"],"
+ "[{\"name\":\"longxia\",\"department\":2.0,\"score\":12.0},\"2\"],"
+ "[{\"name\":\"longxia\",\"department\":0.0,\"score\":10.0},\"0\"]]";
Map<Empolyee,String> map = new HashMap<>();
map = getGson().fromJson(srcJson,map.getClass());
for (Map.Entry<Empolyee,String> entity : map.entrySet()){
System.out.println(entity.getKey()+" "+entity.getValue());
}
}
输出结果
{name=longxia, department=0.0, score=10.0} 0
{name=longxia, department=2.0, score=12.0} 2
{name=longxia, department=1.0, score=11.0} 1
总结:enableComplexMapKeySerialization并不影响Map<String,Object>和Map<Object,String>的反序列化。不管是多维数组还是字符串都是都以序列化为 Map。