当前位置: 首页 > 知识库问答 >
问题:

如何让GSON在未知属性上失败

金伟
2023-03-14

如果json包含未知字段,我需要GSON映射器抛出异常。例如,如果我们有POJO,比如

public class MyClass {
    String name;
}

和json一样

{
    "name": "John",
    "age": 30
}

我想得到某种消息,json包含无法反序列化的未知字段(age)。

我知道Jackson mapper中有开箱即用的解决方案,但在我们的项目中,我们已经使用Gson作为映射器好几年了,使用Jackson会导致项目不同部分的冲突和错误,所以对我来说,编写自己的解决方案比使用Jackson更容易。

换句话说,我想知道是否有与Jackson的< code >反序列化功能等效的功能。Gson中的FAIL _ ON _ UNKNOWN _ PROPERTIES 。或者,如果可以使用Gson的反序列化策略而不是使用反射来完成,情况又会如何呢

共有1个答案

佘茂才
2023-03-14

我相信你不能用Gson自动做到。

我不得不在工作中的一个项目中这样做。我做了以下工作:

Gson GSON = new GsonBuilder().create();
(static final) Map<String, Field> FIELDS = Arrays.stream(MyClass.class.getDeclaredFields())
    .collect(Collectors.toMap(Field::getName, Function.identity()));

JsonObject object = (JsonObject) GSON.fromJson(json, JsonObject.class);

List<String> objectProperties = object.entrySet().stream().map(Entry::getKey).collect(Collectors.toList());
List<String> classFieldNames = new ArrayList<>(FIELDS.keySet());

if (!classFieldNames.containsAll(objectProperties)) {
    List<String> invalidProperties = new ArrayList<>(objectProperties);
    invalidProperties.removeAll(classFieldNames);
    throw new RuntimeException("Invalid fields: " + invalidProperties);
}
 类似资料: