我在 stackoverflow 和 google 上搜索了这个问题,但找不到任何正确的答案。
如何忽略对象内对象的字段?
我认为通过一个例子会更容易理解:
(编者注,标题中:Class1
=Engine
是 Class2
=Car
的字段)
class Car {
Integer id;
Integer numberOfWheels;
Engine engine;
}
class Engine {
Integer id;
String name;
String producer;
Integer horsePower;
Integer weight;
}
Car JSON 应包含所有字段,但 Car 对象中的 Engine 对象应仅限于 id、name、producer
。
{
"id":1,
"numberOfWheels":4,
"engine": {
"id":1,
"name":"some engine"
"producer":"some engine producer"
}
}
但是,引擎 JSON 应包含所有字段 id、名称、生产商、马力、重量
{
"id":1,
"name":"some engine"
"producer":"some engine producer"
"horsePower":250
"weight":500
}
只是为了澄清。仅应在 Car 生成的 JSON 中忽略字段 horsePower
和 weight
。
最佳答案
看看 gson
的 JsonSerializer
和 ExclusionStrategy
。也许不是最简洁的方法 - 特别是与您自己的解决方案相比 - 但总的来说是一个不错的选择。
要使Car
能够进行一些特殊处理,请创建JsonSerializer
,例如
public class CarSerializer implements JsonSerializer<Car> {
private final Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new FieldExclusionStrategy()).create();
@Override
public JsonElement serialize(Car arg0, Type arg1, JsonSerializationContext arg2) {
return new JsonParser().parse(gson.toJson(arg0));
}
}
上面有自己的 gson
来仅处理 Car
并且不会扰乱任何其他序列化。前面提到的将 ExclusionStrategy
注册为自己的私有(private)用途,用于检查 Car
的字段是否为 Engine
以及 Engine
中任何不需要的字段> 被跳过。
public class FieldExclusionStrategy implements ExclusionStrategy {
private Set<String> ignored =
new HashSet<String>(Arrays.asList( new String[]{"horsePower","weight"}));
@Override
public boolean shouldSkipField(FieldAttributes arg0) {
if(arg0.getDeclaringClass().isAssignableFrom(Engine.class))
if(ignored.contains(arg0.getName())) return true;
return false;
}
@Override
public boolean shouldSkipClass(Class<?> arg0) { return false; }
}
它可以与将 JsonSerializer
注册为 Car.class
的类型适配器的 gson
一起使用:
Gson gson = new GsonBuilder().setPrettyPrinting()
.registerTypeAdapter(Car.class, new CarSerializer()).create();
关于java - 在 JSON 序列化中,如果 Class1 是 Class2 的字段,如何忽略某些 Class1 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242103/