java - 在 JSON 序列化中,如果 Class1 是 Class2 的字段,如何忽略某些 Class1 字段?

标签 java json serialization gson

我在 stackoverflow 和 google 上搜索了这个问题,但找不到任何正确的答案。

如何忽略对象内对象的字段?

我认为通过一个例子会更容易理解:

(编者注,标题中:Class1=EngineClass2=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 中忽略字段 horsePowerweight

最佳答案

看看 gsonJsonSerializerExclusionStrategy。也许不是最简洁的方法 - 特别是与您自己的解决方案相比 - 但总的来说是一个不错的选择。

要使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/

相关文章:

c# - 如何使用 WebAPI 和 Linq 序列化部分类

c++ - 如何通过指向基类的指针序列化派生类? Derived::serialize 未调用

尽管使用 CLASSPATH 环境变量,但仍出现 java.lang.ClassNotFoundException

java - 在 AppEngine Datastore (Objectify) 中定义内部类

java - 如何使用 Web 服务和 MySQL 创建 Java 后端?

java - 从文件中读取特殊字符时出现问题

json - RestSharp:如何跳过将空值序列化为 JSON?

javascript - 将 javascript 字符串化字符串转换为 java 字符串

javascript - Microsoft QnA Maker API 错误未找到资源

c# - 如何将 XML 反序列化为 json 和将 json 反序列化为 c# 类?