GSON没有检索linkedHashMap <object,string =“”>中的键作为对象。而是检索为String </object,>

时间:2014-02-08 12:37:01

标签: java android android-intent gson

我试图通过Gson从一个活动发送LinkedHashMap。但是在另一个活动中,当我试图获取LinkedHashMap的键时,它将被检索为String类型的键,而不是Object类型的键。我在下面提供了我的代码。

活动1:

    LinkedHashMap<TravelMode, String> polyPoints=(LinkedHashMap<TravelMode, String>) gData.values().toArray()[0];
    Gson gson = new Gson();
    Type entityType= new TypeToken< LinkedHashMap<TravelMode, String> >(){}.getType();
    String list = gson.toJson(polyPoints,entityType);
    mapIntent.putExtra(EXTRA_MESSAGE, list);

活动2:

    String str= getIntent().getStringExtra(EXTRA_MESSAGE);
    Gson gson = new Gson();
    Type entityType= new TypeToken< LinkedHashMap<TravelMode, String> >(){}.getType();
    LinkedHashMap<TravelMode, String>polypoint = gson.fromJson(str, entityType);

这是我在执行程序时遇到的错误

com.google.gson.JsonSyntaxException) com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 android 

TravelMode:

   class TravelMode implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public String travelMode;

    /**
     * @return the travelMode
     */
    public String getTravelMode() {
        return travelMode;
    }

    /**
     * @param travelMode the travelMode to set
     */
    public void setTravelMode(String travelMode) {
        this.travelMode = travelMode;
    }

    public TravelMode(String travelMode) {
        super();
        this.travelMode = travelMode;
    }
}

请帮帮我。

1 个答案:

答案 0 :(得分:3)

如果地图Gson是自定义对象,那么

keys会出现问题。默认进程会在您的密钥上调用toString(),因为密钥的toString()未被覆盖,您可能会收到类似:TravelMode@138532dc的输出,从而导致错误。

要解决此问题,您必须实现Gson Custom Serializer和Deserializer(请参阅user guide here以及他们对其他其他库类的建议。)

或者使用Map<String, String>进行实施。