我有一个要使用for (int i = 0; i < block.Length; i++)
{
if (block[i] < 32)
{
block[i] = 0x20;
}
}
进行序列化的对象:
Gson
在顶级对象级别,我希望class User {
String firstname;
String lastname;
JsonElement opaqueData;
}
忽略Gson
字段(例如,如果null
是lastname
,则不应对其进行序列化。)
但是在字段null
中,我希望opaqueData
进行序列化,因为它应该是不透明数据块。因此,使用null
无效。
但是new GsonBuilder().serializeNulls().create().toJson(user)
也不起作用
@JsonAdapter
似乎适配器被Gson忽略。
这是预期的行为吗?在没有为整个User类创建适配器然后手动序列化每个字段的情况下,如何做到这一点?
答案 0 :(得分:3)
Gson
不会去适应其内部数据类型JsonElement
。我不知道是否有任何意义,因为JsonElement
类型是适应的结果。
浏览source code of Gson时,您可以看到两种顶级方法:
对于任何对象
public String toJson(Object src) {
if (src == null) {
return toJson(JsonNull.INSTANCE);
}
return toJson(src, src.getClass());
}
我认为不复制上述方法的其余代码就很明显,上述方法之一在其执行路径中具有搜索和设置适配器(并查询适配器工厂)的功能。但是还有类似的方法:
对于JsonElement
public String toJson(JsonElement jsonElement) {
StringWriter writer = new StringWriter();
toJson(jsonElement, writer);
return writer.toString();
}
,对于该执行路径,没有搜索,也没有将任何适配器设置为JsonElement
都不再适用。
因此,当Gson
命中任何JsonElement
时,它只会将ti序列化为格式化字符串,并且不会影响任何适配器。
如果您确实需要序列化这样的内容,也许可以为JsonElement
创建一个包装类,例如:
public class JsonElementWrapper {
public JsonElement jsonElement;
}
并调整您的TypeAdapter
以使其适应“ null”或实际值。