Java Gson-将任何空值序列化为空字符串

Java Gson-将任何空值序列化为空字符串,java,gson,Java,Gson,我正在使用gson序列化某个对象。我有一个要求,任何空字段都应该被视为空字符串,独立于字符串、double或pojo变量 我尝试为对象创建一个自定义序列化程序,并简单地为空值对象返回一个新的JsonPrimitive(“”),但问题是如何处理非空值对象,而不使用“instanceof”或“getClass”并处理每种类型 如果您有任何关于如何执行此操作的想法,我们将不胜感激。请参见这可以通过为您的模型对象使用自定义类型适配器来完成 您可以使用反射迭代对象字段,并且每当字段为null时,只要跨越n

我正在使用gson序列化某个对象。我有一个要求,任何空字段都应该被视为空字符串,独立于字符串、double或pojo变量

我尝试为对象创建一个自定义序列化程序,并简单地为空值对象返回一个新的JsonPrimitive(“”),但问题是如何处理非空值对象,而不使用“instanceof”或“getClass”并处理每种类型


如果您有任何关于如何执行此操作的想法,我们将不胜感激。

请参见

这可以通过为您的模型
对象使用自定义
类型适配器来完成

您可以使用反射迭代对象字段,并且每当字段为
null
时,只要跨越null字段,就将json表示中的值设置为空字符串


这绝对很难维持,并且应该在一些风险下进行,正如@Sotirios Delimanolis所说,如果相应的引用不是字符串,您打算如何来回处理它

  • 下面是一个bean结构,用于展示这种情况:
公共类MyEntity
{
私有int-id;
私有字符串名称;
私人长社会号码;
私有MyInnerEntity;
公共MyEntity(整数id、字符串名称、长社会编号、MyInnerEntity)
{
this.id=id;
this.name=名称;
this.socialNumber=socialNumber;
this.innerEntity=innerEntity;
}
公共int getId()
{
返回id;
}
公共字符串getName()
{
返回名称;
}
公共长getSocialNumber()
{
返回社会号码;
}
公共MyInnerEntity getInnerEntity()
{
返回内部实体;
}
公共静态类MyInnerEntity{
@凌驾
公共字符串toString()
{
返回“whateverValue”;
}
}
}
  • 下面是
    TypeAdapter
    实现,它将任何
    null
    值设置为空
    字符串
公共类GenericaAdapter扩展了TypeAdapter
{
@凌驾
public void write(JsonWriter,JsonWriter,Object o)抛出IOException
{
jsonWriter.beginObject();
对于(字段:o.getClass().getDeclaredFields())
{
对象字段值=runGetter(字段,o);
jsonWriter.name(field.getName());
如果(fieldValue==null)
{
jsonWriter.value(“”);
}
否则{
jsonWriter.value(fieldValue.toString());
}
}
jsonWriter.endObject();
}
@凌驾
公共对象读取(JsonReader JsonReader)引发IOException
{
/*别忘了在此处添加实现以使对象恢复活动状态:)*/
返回null;
}
/**
*通用字段访问器运行程序。
*在字段上运行正确的getter以获取其值。
*@param字段
*@param o{@code Object}
*@返回
*/
公共静态对象runGetter(字段,对象o)
{
//MZ:找到正确的方法
对于(方法:o.getClass().getMethods())
{
if((method.getName().startsWith(“get”)&&(method.getName().length()==(field.getName().length()+3)))
{
if(方法.getName().toLowerCase().endsWith(字段.getName().toLowerCase()))
{
尝试
{
返回方法调用(o);
}
捕获(非法访问例外e)
{ }
捕获(调用TargetException e)
{ }
}
}
}
返回null;
}
}
  • 现在有一个简单明了的
    main
    方法将适配器添加到
    Gson
公共类测试
{
公共静态void main(字符串[]args)
{
Gson Gson=new GsonBuilder().registerTypeAdapter(MyEntity.class,new GenericaAdapter()).create();
Object entity=new MyEntity(16,“entity”,(long)123,new MyEntity.MyInnerEntity());
字符串json=gson.toJson(实体);
System.out.println(json);
Object entity2=新的MyEntity(0,null,null,null);
json=gson.toJson(entity2);
System.out.println(json);
}
}
这将导致以下输出:

{"id":"16","name":"entity","socialNumber":"123","innerEntity":"whateverValue"}
{"id":"0","name":"","socialNumber":"","innerEntity":""}

请注意,无论对象的类型是什么,其值在封送的json字符串中都设置为“”。

如果相应的引用不是
字符串怎么办?