将默认序列化器应用于自定义序列化器中的属性(GSON)

3
我正在为我的领域对象编写自定义GSON序列化器,以便它只序列化特定的对象:
 @Override
    public JsonElement serialize(BaseModel src, Type typeOfSrc, JsonSerializationContext context) {

        JsonObject obj = new JsonObject();


        Class objClass= src.getClass();

        try {
            for(PropertyDescriptor propertyDescriptor : 
                Introspector.getBeanInfo(objClass, Object.class).getPropertyDescriptors()){

                                    if(BaseModel.class.isAssignableFrom(propertyDescriptor.getPropertyType()))
                {
                    //src.getId()
                }
                else if(Collection.class.isAssignableFrom(propertyDescriptor.getPropertyType()))
                {
                    //whatever
                }
                else {
                    String value = (propertyDescriptor.getReadMethod().invoke(src)) != null?propertyDescriptor.getReadMethod().invoke(src).toString():"";
                    obj.addProperty(propertyDescriptor.getName(), value);
                }
            }
        } catch (IntrospectionException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return obj;
    }

问题是我也想序列化HashMap,但这样我得到的值是这样的:

{"key"=com.myproject.MyClass@28df0c98}

而我希望Gson对HashMap应用默认的序列化行为。我怎么告诉GSON以正常方式序列化某些对象?

2个回答

2

警告:回答已经过时。
虽然这个答案最初被接受并获得了赞同,但后来也有人对其进行了反对和评论,认为它是错误的,所以我想它已经过时了。


我相信你可以使用作为 serialize 方法参数的 JsonSerializationContext context 对象。

实际上,根据 Gson API 文档,这个对象有一个方法叫做 serialize:

在指定的对象上调用默认的序列化。

所以我想你只需要在你想要正常序列化你的 HashMap 的地方,像这样做:

context.serialize(yourMap);

8
对我来说,它将使用自定义序列化,这将导致一个无限循环... - Orden
该函数的文档明确指出不要这样做:“在指定对象上调用默认序列化,传递特定类型信息。它永远不应该在JsonSerializer.serialize(Object, Type, JsonSerializationContext)方法的参数元素上调用。这样做会导致无限循环,因为Gson将反过来再次调用自定义序列化器。” - John Red

0
你可以实例化另一个 GsonBuilder 并使用它,这是你能做的。 你甚至可以附加其他信息,就像我在代码的最后一行所做的一样(有33%的机会能够编辑列表)。
final GsonBuilder gb = new GsonBuilder();
JsonObject serializedObject = (JsonObject) gb.create().getAdapter(HashMap.class).toJsonTree(yourMap);
serializedObject.addProperty("canEdit", Math.random < 0.33); // append additional info

然后,您可以将该serializedObject包含到您的属性中,或者返回它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接