当前位置: 首页 > 面试题库 >

Gson:有没有更简单的方法来序列化地图

燕刚捷
2023-03-14
问题内容

来自Gson项目的此链接似乎表明,将类型化的Map序列化为JSON时,我将必须执行以下操作:

    public static class NumberTypeAdapter 
      implements JsonSerializer<Number>, JsonDeserializer<Number>,
InstanceCreator<Number> {

    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<String, Number> map = new HashMap<String, Number>();    
    map.put("int", 123);
    map.put("long", 1234567890123456789L);
    map.put("double", 1234.5678D);
    map.put("float", 1.2345F);
    Type mapType = new TypeToken<Map<String, Number>>() {}.getType();

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

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

很酷,这行得通,但是似乎有很多开销( 整个Type Adapter类?
)。我使用了其他JSONLib之类的JSON库,它们使您可以通过以下方式构建地图:

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

或者,如果我有一个自定义类,则如下所示:

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

过程更加手动,但是所需的代码更少,并且没有开销来为Number创建自定义类型适配器,或者在大多数情况下 为我自己的自定义类
创建自定义类型适配器。

这是使用Gson序列化地图的唯一方法,还是有人在上面的链接中找到了超越Gson建议的方法。


问题答案:

只有TypeToken一部分是必需的(当涉及泛型时)。

Map<String, String> myMap = new HashMap<String, String>();
myMap.put("one", "hello");
myMap.put("two", "world");

Gson gson = new GsonBuilder().create();
String json = gson.toJson(myMap);

System.out.println(json);

Type typeOfHashMap = new TypeToken<Map<String, String>>() { }.getType();
Map<String, String> newMap = gson.fromJson(json, typeOfHashMap); // This type must match TypeToken
System.out.println(newMap.get("one"));
System.out.println(newMap.get("two"));

输出:

{"two":"world","one":"hello"}
hello
world


 类似资料:
  • 问题内容: 有没有一种方法可以序列化angularjs的功能? 我的帖子现在看起来像这样。 问题答案: 这不是使用AngularJS访问表单数据的方式。表单中的数据应在范围内绑定。 因此,使用一个对象,例如$ scope.formData,它将包含您的所有数据结构,然后应使用ng-model将每个表单元素绑定到此对象。 例如: http://jsfiddle.net/rd13/AvGKj/13/

  • 我正在开发一个java程序,它接受输入的分数,给出输入的总数和平均值,但是我很难计算出如何获得当前输入的最高分数“我使用了大量嵌套的else-if语句,但必须有一种简单的方法来实现这一点,而不是键入100个else-if语句这是我的代码。我在else-if语句开始的地方添加了一条注释,以确定最高级别

  • 问题内容: 我正在尝试弄清楚如何解析一些XML(对于Android应用程序),在Java中很难做到这一点似乎很荒谬。似乎需要创建一个具有各种回调(startElement,endElement等)的XML处理程序,然后您必须注意将所有这些数据更改为对象。类似于本教程。 我真正需要的只是将XML文档更改为多维数组,甚至更好的是拥有某种Hpricot处理器。有没有办法做到这一点,还是真的必须在上面的示

  • 如何将gson添加到我与gradle的项目中?我只看到人们在他们的项目中添加文件。我不想下载这个项目并把它放在我的项目中。

  • 我试图通过对println语句使用循环来缩短代码。不打印名称和高度的单独语句,是否有其他方法使用相同的格式进行此操作?:

  • 问题内容: 似乎有很多方法可以在Python中定义单例。关于堆栈溢出是否有共识? 问题答案: 我没有真正的需要,因为具有功能(而不是类)的模块可以很好地用作单例。它的所有变量都将绑定到模块,该模块无论如何都无法重复实例化。 如果您确实希望使用类,则无法在Python中创建私有类或私有构造函数,因此,您只能通过使用API​​的约定来保护自己免受多重实例化。我仍然将方法放在模块中,并将模块视为单例。