gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:43 25 4
gpt4 key购买 nike

我有一个包含多个字段的对象列表。根据 API 调用,将返回仅包含一组特定字段的列表。当我使用 transient - 它不会序列化该特定字段。但是,应该为另一个 API 调用返回该字段。我正在使用 Gson。

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

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

例如

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("\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 -
[
   {
      "name": "John"
   },
   {
      "name": "David"
   },
   {
      "name": "June"
   }
]
2017-12-23 19:47:17.034 ERROR org.example.gson.FieldExclusionStrategyTest:44 -
[
   {
      "name": "John",
      "location": "Chicago"
   },
   {
      "name": "David",
      "location": "Seattle"
   },
   {
      "name": "June",
      "location": "Dallas"
   }
]
2017-12-23 19:47:17.035 ERROR org.example.gson.FieldExclusionStrategyTest:51 -
[
   {
      "location": "Chicago"
   },
   {
      "location": "Seattle"
   },
   {
      "location": "Dallas"
   }
]

更改序列化字段名称列表后,需要重新构建GSON

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

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

另见 my question关于这个话题。

关于java - 如何使用 GSON 配置哪些 POJO 字段序列化为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47954197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com