2015-01-22 3 views
0

В настоящее время, если я хочу, чтобы избежать gson от десериализации JSON строки в LinkedHashMap, я хотел бы использовать следующий кодИзбегайте gson десериализации JSON строку в LinkedHashMap членов класса

HashMap<Integer, String> map = gson.fromJson(json_string, new TypeToken<HashMap<Integer, String>>(){}.getType()); 

Однако, у меня есть следующий класс

public static class Inventory { 
    public Map<Integer, String> map1 = new HashMap<Integer, String>(); 
    public Map<Integer, String> map2 = new HashMap<Integer, String>(); 
} 

Если я использую Inventory result = gson.fromJson(json_string, Inventory.class);, мой Inventory экземпляра будет иметь свои член класса, как LinkedHashMap.

Как я могу привести в действие строку де-сериализации json, чтобы иметь HashMap в качестве членов класса?

Вот пример рабочего кода

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.reflect.TypeToken; 
import java.util.HashMap; 
import java.util.Map; 

/** 
* 
* @author yccheok 
*/ 
public class Gson_tutorial { 
    public static class Inventory { 
     public Map<Integer, String> map1 = new HashMap<Integer, String>(); 
     public Map<Integer, String> map2 = new HashMap<Integer, String>(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     { 
      Map<Integer, String> map= new HashMap<Integer, String>(); 
      map.put(2, "cake"); 

      final Gson gson = new GsonBuilder().create(); 
      final String json_string = gson.toJson(map); 
      // {"2":"cake"} 
      System.out.println(json_string); 

      HashMap<Integer, String> result = gson.fromJson(json_string, new TypeToken<HashMap<Integer, String>>(){}.getType()); 
      // class java.util.HashMap 
      System.out.println(result.getClass()); 
     } 

     { 
      Inventory inventory = new Inventory(); 
      inventory.map1.put(2, "cake"); 
      inventory.map2.put(3, "donut"); 

      final Gson gson = new GsonBuilder().create(); 
      final String json_string = gson.toJson(inventory); 
      // {"map1":{"2":"cake"},"map2":{"3":"donut"}} 
      System.out.println(json_string); 

      Inventory result = gson.fromJson(json_string, Inventory.class); 
      // class java.util.LinkedHashMap 
      System.out.println(result.map1.getClass()); 
      // class java.util.LinkedHashMap 
      System.out.println(result.map2.getClass()); 
     } 
    } 
} 
+0

LinkedHashMap - это подкласс HashMap, поэтому, если вы получаете LinkedHashMap, у вас уже есть HashMap. В чем проблема? –

ответ

1

Объявите свои поля, как HashMap с. Не считая этого, вам нужно использовать собственный десериализатор.

Но если вы используете Map, почему вас это волнует, если это LinkedHashMap или HashMap?

+0

Инвентарь - это сторонняя библиотека. В одной из функций Inventory он выполнит кастинг с карты на HashMap. –

+0

@CheokYanCheng. Ну, это не отличная сторонняя библиотека :(Gson не подходит для этого. Рассмотрим использование Джексона и его микшинов. –

+0

@CheokYanCheng But HotLicks добавляет хороший комментарий в свой комментарий: «LinkedHashMap'_is_ a« HashMap ». Вы получаете какой-то« ClassCastException »? –

Смежные вопросы