gson 获取hasmap,来自Json的GSON返回LinkedHashMap而不是EnumMap

I want to make gson able to return an EnumMap object. I use the following code

package sandbox;

import com.google.gson.Gson;

import com.google.gson.reflect.TypeToken;

import java.util.EnumMap;

import java.util.Map;

/**

*

* @author yccheok

*/

public class Sandbox {

public static void main(String[] args) throws InterruptedException {

testGson();

}

public static enum Country {

Malaysia,

UnitedStates

}

public static void testGson() {

Map enumMap = new EnumMap(Country.class);

enumMap.put(Country.Malaysia, "RM");

enumMap.put(Country.UnitedStates, "USD");

Gson gson = new Gson();

String string = gson.toJson(enumMap);

System.out.println("toJSon : " + string);

enumMap = gson.fromJson(string, new TypeToken>(){}.getType());

System.out.println("fromJSon : " + enumMap);

System.out.println("fromJSon : " + enumMap.getClass());

}

}

However, I'm getting the following

toJSon : {"Malaysia":"RM","UnitedStates":"USD"}

fromJSon : {Malaysia=RM, UnitedStates=USD}

fromJSon : class java.util.LinkedHashMap

even though I had used new TypeToken>(){}.getType() to specific I want EnumMap instead of LinkedHashMap

How can I make gson to return EnumMap?

解决方案

Even with a type token, Gson can only deserialize data into classes that have a default constructor. And EnumMap doesn't have one (it needs to be instantiated with the type of enum that its elements will match). The easiest way around this problem is to define and use an InstanceCreator:

This interface is implemented to create instances of a class that does not define a no-args constructor. If you can modify the class, you should instead add a private, or public no-args constructor. However, that is not possible for library classes, such as JDK classes, or a third-party library that you do not have source-code of. In such cases, you should define an instance creator for the class. Implementations of this interface should be registered with GsonBuilder.registerTypeAdapter(Type, Object) method before Gson will be able to use them.

Heres some example code:

InstanceCreator:

class EnumMapInstanceCreator, V> implements

InstanceCreator> {

private final Class enumClazz;

public EnumMapInstanceCreator(final Class enumClazz) {

super();

this.enumClazz = enumClazz;

}

@Override

public EnumMap createInstance(final Type type) {

return new EnumMap(enumClazz);

}

}

Test code:

final Gson gson = new GsonBuilder().registerTypeAdapter(

new TypeToken>() {

}.getType(),

new EnumMapInstanceCreator(Country.class))

.create();

final Map enumMap = new EnumMap(

Country.class);

enumMap.put(Country.Malaysia, "RM");

enumMap.put(Country.UnitedStates, "USD");

String string = gson.toJson(enumMap);

System.out.println("toJSon : " + string);

final Map reverseEnumMap = gson.fromJson(string,

new TypeToken>() {

}.getType());

System.out.println("fromJSon (Class): " + reverseEnumMap.getClass());

System.out.println("fromJSon : " + reverseEnumMap);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值