Android 自定义GSON解析器基于属性值排除对象实例

Android 自定义GSON解析器基于属性值排除对象实例,android,json,gson,Android,Json,Gson,当使用GSON解析器在Android中解析JSON时,我想实现一个规则,该规则将根据属性值排除创建的任何对象。例如: {"people": [ {"first_name": "Bob"}, {"first_name": "Bob", "last_name": "Loblaw"}]} 我想排除第一人称对象,因为它没有姓氏属性 在解析时可以这样做吗?使用JsonDeserializer可以这样做 假设你喜欢波乔 public class Response { @Getter

当使用GSON解析器在Android中解析JSON时,我想实现一个规则,该规则将根据属性值排除创建的任何对象。例如:

{"people": [
    {"first_name": "Bob"},
    {"first_name": "Bob", "last_name": "Loblaw"}]}
我想排除第一人称对象,因为它没有姓氏属性

在解析时可以这样做吗?

使用JsonDeserializer可以这样做

假设你喜欢波乔

public class Response {
   @Getter
   private List<Person> people = new ArrayList<>();
}
创建类似JsonDeserializer的


因此,这是如果需要在解析时完成的话。也许在解析后循环人员并排除没有姓氏的人员会更好。

回答得好,我将尽可能接近这里。我想我会在解析之后清理数据。
public class Person {
   @Getter @Setter
   private String first_name, last_name;
}
public class PersonResponseDeserializer implements JsonDeserializer<Response> {
   // Create a new gson to make the default parsing for response object
   private final Gson gson = new Gson();

   @Override
   public Response deserialize(JsonElement json, Type typeOfT
         , JsonDeserializationContext context) throws JsonParseException {
      Response r = gson.fromJson(json, typeOfT);
      // Remove all persons from R that have last name null
      r.getPeople().removeAll(
            r.getPeople().stream().filter( p -> p.getLast_name() == null )
             .collect(Collectors.toSet())
      );
      return r;
   }
}
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Response.class, new PersonResponseDeserializer())
        .create();
Response r = gson.fromJson(s, Response.class);