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

sxpgvts3  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(148)

我正在为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;
    }

问题是我也想序列化HashMaps,但这样我得到的值如下:
{“关键字”=com.myproject.MyClass@28df0c98}
虽然我希望默认的序列化行为Gson应用于HashMaps,但我如何让GSON“正常”地序列化某些对象呢?

ee7vknir

ee7vknir1#

警告:答案已过期。

  • 虽然这个答案一开始被接受并被支持,但后来也有反对票和评论说它是错误的,所以我猜它已经过时了。*

我非常肯定,您可以使用JsonSerializationContext context对象作为serialize方法的参数。
实际上,根据Gson API documentation,此对象具有一个方法serialize,该方法:
在指定的对象上叫用预设序列化。
因此,我猜您只需要在您想要序列化HashMap * normal * 时执行类似以下的操作:

context.serialize(yourMap);
pkmbmrz7

pkmbmrz72#

你可以做的是示例化另一个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包含到属性中,或将其返回。

相关问题