自定义GSON解析器根据属性值排除对象实例

时间:2017-12-08 04:02:14

标签: android json gson

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

{"people": [
    {"first_name": "Bob"},
    {"first_name": "Bob", "last_name": "Loblaw"}]}

我想排除第一个人对象,因为它没有姓氏属性。

解析时是否可以这样做?

1 个答案:

答案 0 :(得分:1)

可以使用JsonDeserializer

假设您有像

这样的POJO
public class Response {
   @Getter
   private List<Person> people = new ArrayList<>();
}

public class Person {
   @Getter @Setter
   private String first_name, last_name;
}

创建JsonDeserializer之类的

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);

因此,如果需要在解析时完成。也许最好在解析后循环People,然后排除没有姓氏的Person