Gson: Есть ли более простой способ сериализации карты

Эта ссылка из проекта Gson, кажется, указывает на то, что мне нужно было бы сделать что-то вроде следующего для сериализации типизированной карты в JSON:

    public static class NumberTypeAdapter 
      implements JsonSerializer, JsonDeserializer,
InstanceCreator {

    public JsonElement serialize(Number src, Type typeOfSrc, JsonSerializationContext
context) {
      return new JsonPrimitive(src);
    }

    public Number deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
        throws JsonParseException {
      JsonPrimitive jsonPrimitive = json.getAsJsonPrimitive();
      if (jsonPrimitive.isNumber()) {
        return jsonPrimitive.getAsNumber();
      } else {
        throw new IllegalStateException("Expected a number field, but was " + json);
      }
    }

    public Number createInstance(Type type) {
      return 1L;
    }
  }

  public static void main(String[] args) {
    Map map = new HashMap();    
    map.put("int", 123);
    map.put("long", 1234567890123456789L);
    map.put("double", 1234.5678D);
    map.put("float", 1.2345F);
    Type mapType = new TypeToken>() {}.getType();

    Gson gson = new GsonBuilder().registerTypeAdapter(Number.class, new
NumberTypeAdapter()).create();
    String json = gson.toJson(map, mapType);
    System.out.println(json);

    Map deserializedMap = gson.fromJson(json, mapType);
    System.out.println(deserializedMap);
  }

Круто, и это работает, но похоже на слишком много накладных расходов ( целый класс адаптера типа? ). Я использовал другие библиотеки JSON, такие как JSONLib, и они позволяют создавать карту следующим образом:

JSONObject json = new JSONObject();
for(Entry entry : map.entrySet()){
     json.put(entry.getKey(), entry.getValue());
}

Или, если у меня есть собственный класс, примерно так:

JSONObject json = new JSONObject();
for(Entry entry : map.entrySet()){
 JSONObject myClassJson =  JSONObject.fromObject(entry.getValue());
     json.put(entry.getKey(), myClassJson);
}

Процесс более ручной, но требует гораздо меньше кода и у меня нет накладных расходов на создание настраиваемого адаптера типа для числа или, в большинстве случаев для моего собственного настраиваемого класса .

Это единственный способ сериализации карты с помощью Gson, или кто-нибудь нашел способ, превосходящий то, что рекомендует Gson в приведенной выше ссылке.

57
задан stevebot 2 December 2011 в 18:24
поделиться