如何使用GSON配置哪些POJO字段序列化为JSON?

时间:2017-12-23 16:43:26

标签: java json gson

我有一个包含多个字段的对象列表。根据API调用,返回的List只包含一组特定的字段。当我使用瞬态时 - 它不会序列化该特定字段。但是,应该返回该字段以进行另一个API调用。我正在使用Gson。

在下面的示例中,基于API,我想打印一个只有E.g的Table实例列表。 "名称"表格实例,或两者" name"和"位置",或只是位置。表对象中可能有30个字段。

一种方法是将每个方案映射到POJO,然后将其打印出来。有一个更好的方法吗?您可以在其中选择/选择/约束哪个字段被序列化。

E.g。

package Testing;

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class TestJson {

    public static Gson obGson = new GsonBuilder().setPrettyPrinting().create();

    public static void main(String[] args) {

        ArrayList<Table> myTable = new ArrayList<Table>();

        myTable.add(new Table("John", "Chicago"));
        myTable.add(new Table("David", "Seattle"));
        myTable.add(new Table("June", "Dallas"));

        System.out.println(obGson.toJson(myTable));

    }

}

class Table {

    String name;
    String location;

    public Table (String _name, String _location) {

        name        = _name;
        location    = _location;

    }
}

上面的输出如下所示。调用API-1时,输出应如下所示。

[
  {
    "name": "John",
    "location": "Chicago"
  },
  {
    "name": "David",
    "location": "Seattle"
  },
  {
    "name": "June",
    "location": "Dallas"
  }
]

但是当调用API-2时,输出应该如下所示。仅返回批准用于该API调用的字段。

[
  {
    "name": "John"
  },
  {
    "name": "David"
  },
  {
    "name": "June"
  }
]

同样,可以根据API调用来管理返回。

1 个答案:

答案 0 :(得分:3)

实施ExclusionStrategy之类的

@RequiredArgsConstructor
public class FieldExclusionStrategy implements ExclusionStrategy { 

   @NonNull
   private final Collection<String> serializedFields;

   @Override
   public boolean shouldSkipField(FieldAttributes f) {
      if(serializedFields.contains(f.getName())) return false;
      return true;
   }

   @Override
   public boolean shouldSkipClass(Class<?> clazz) { return false; }

}

使用

@Test
public void testShouldSkipField() {

   Gson gson;      
   Table table = new Table();

   Collection<String> serializedFields = new ArrayList<>();

   ArrayList<Table> myTable = new ArrayList<Table>();
   myTable.add(new Table("John", "Chicago"));
   myTable.add(new Table("David", "Seattle"));
   myTable.add(new Table("June", "Dallas"));

   serializedFields.add("name");
   gson = new GsonBuilder()
         .setPrettyPrinting()
         .addSerializationExclusionStrategy(
                new FieldExclusionStrategy(serializedFields))
         .create();
   log.info("\n{}", gson.toJson(myTable));      

   serializedFields.add("location");      
   gson = new GsonBuilder()
         .setPrettyPrinting()
         .addSerializationExclusionStrategy(
                new FieldExclusionStrategy(serializedFields))
         .create();
   log.error("\n{}", gson.toJson(myTable));      

   serializedFields.remove("name");      
   gson = new GsonBuilder()
         .setPrettyPrinting()
         .addSerializationExclusionStrategy(
                new FieldExclusionStrategy(serializedFields))
         .create();
   log.error("\n{}", gson.toJson(myTable));      

}

上面会记录类似

的内容
  

2017-12-23 19:47:17.028 INFO org.example.gson.FieldExclusionStrategyTest:37 -
  [
  {
  “名字”:“约翰”
  },
  {
  “名字”:“大卫”
  },
  {
  “名字”:“六月”
  }
  ]
  2017-12-23 19:47:17.034 ERROR org.example.gson.FieldExclusionStrategyTest:44 -
  [
  {
  “名字”:“约翰”,
  “位置”:“芝加哥”
  },
  {
  “名字”:“大卫”,
  “位置”:“西雅图”
  },
  {
  “名字”:“六月”,
  “位置”:“达拉斯”
  }
  ]
  2017-12-23 19:47:17.035 ERROR org.example.gson.FieldExclusionStrategyTest:51 -
  [
  {
  “位置”:“芝加哥”
  },
  {
  “位置”:“西雅图”
  },
  {
  “位置”:“达拉斯”
  }
  ]

更改序列化字段名称列表后,您需要再次构建GSON

GSON在内部缓存结果 - true | false - 首次调用某个字段名称时,不会再次查询缓存的字段名称。

要添加ExclusionStrategy,您需要使用GSON构建GsonBuilder,然后注册ExclusionStrategy(或其中许多)。

有关此主题,另请参阅my question

相关问题