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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用GSON配置哪些POJO字段序列化为JSON?相关的知识,希望对你有一定的参考价值。

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

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

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

EG

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调用来管理返回。

答案

实施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("
{}", gson.toJson(myTable));      

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

   serializedFields.remove("name");      
   gson = new GsonBuilder()
         .setPrettyPrinting()
         .addSerializationExclusionStrategy(
                new FieldExclusionStrategy(serializedFields))
         .create();
   log.error("
{}", 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关于此主题。

以上是关于如何使用GSON配置哪些POJO字段序列化为JSON?的主要内容,如果未能解决你的问题,请参考以下文章

使用 GSON 序列化到 JSON 的类是不是应该实现可序列化接口

你真的会用Gson吗?Gson使用指南

android中的proguard - 我应该混淆gson POJO

Java Jackson将空字段反序列化为POJO中的默认空列表

JSON转换为GSON和POJO类

RestController的配置将YAML反序列化为pojo上载为原始主体?