我正在为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“正常”地序列化某些对象呢?
2条答案
按热度按时间ee7vknir1#
警告:答案已过期。
我非常肯定,您可以使用
JsonSerializationContext context
对象作为serialize
方法的参数。实际上,根据Gson API documentation,此对象具有一个方法serialize,该方法:
在指定的对象上叫用预设序列化。
因此,我猜您只需要在您想要序列化
HashMap
* normal * 时执行类似以下的操作:pkmbmrz72#
你可以做的是示例化另一个GsonBuilder并使用它。你甚至可以附加额外的信息,就像我在最后一行代码中所做的那样(33%的机会能够编辑列表)
然后,您可以将该serializedObject包含到属性中,或将其返回。