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

问题描述 投票:2回答:1

我正在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,但是这样我就得到了像这样的值:

{“ key” =com.myproject.MyClass@28df0c98}

虽然我希望Gson适用于HashMaps的默认序列化行为。如何告诉GSON在序列化某些对象时“正常”执行操作?

java json gson
1个回答
2
投票
警告:答案过期。

尽管此答案最初被接受并被赞成,但后来也有反对和评论说这是错误的,所以我认为它已经过时了。

我很确定您可以将拥有的JsonSerializationContext context对象用作serialize方法的参数。
实际上,根据Gson API documentation,此对象具有序列化该方法的方法:

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

所以我想您只需要在要序列化HashMap

通常

的位置上执行类似的操作:

context.serialize(yourMap);

© www.soinside.com 2019 - 2024. All rights reserved.