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

Jackson在序列化期间添加不存在的字段

司承业
2023-03-14

映射器:

public static ObjectMapper mapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
            .enable(SerializationFeature.INDENT_OUTPUT);

要序列化的类:

@Builder(builderClassName = "GooglePlayGameBuilder", toBuilder = true)
@JsonDeserialize(builder = GooglePlayGame.GooglePlayGameBuilder.class)
public final class GooglePlayGame  {

    @JsonProperty("Title") private final String title;
    @JsonProperty("Genre") private final String genre;
    @JsonProperty("Price") private final String price;
    @JsonProperty("Last updated") private final String lastUpdated;
    @JsonProperty("Current version") private final String currentVersion;
    @JsonProperty("Requirements") private final String requiresAndroid;
    @JsonProperty("IAP") private final String IAP;
    @JsonProperty("Contacts") private final String devEmail;

...

public static volatile ConcurrentMap<String, GooglePlayGame> games = new ConcurrentSkipListMap<>(String.CASE_INSENSITIVE_ORDER);
public static void saveLibraryToFile(){
        try {
            mapper.writeValue(new File(LIBRARY_FILENAME), games);
        } catch (IOException e) {
            log.error("[Couldn't write to file] ", e.getMessage());
        }
    }
{
  "Never Alone: Ki Edition" : {
    "Title" : "Never Alone: Ki Edition",
    "Genre" : "Adventures",
    "Price" : "4,99 €",
    "Last updated" : "September 15, 2016",
    "Current version" : "1.0.0",
    "Requirements" : "2.3+",
    "IAP" : "nope",
    "Contacts" : "support@neveralonegame.com"
  },
...
{
  "Never Alone: Ki Edition" : {
    "iap" : "nope"
    "Title" : "Never Alone: Ki Edition",
    "Genre" : "Adventures",
    "Price" : "4,99 €",
    "Last updated" : "September 15, 2016",
    "Current version" : "1.0.0",
    "Requirements" : "2.3+",
    "IAP" : "nope",
    "Contacts" : "support@neveralonegame.com"
  },

我不懂这个领域:

"iap" : "nope"

从Jackson那里找到的?我用日志检查了我的本地地图,结果发现这个字段不存在,但在序列化过程中它出现了。

共有1个答案

徐麒
2023-03-14

Lombok将为字段IAP创建一个名为getIAP()的getter方法。然后,Jackson将自动检测它作为一个名为iap的属性。由于属性名称区分大小写,因此这是一个不同于@JSONProperty(“IAP”)注释定义的IAP属性的属性。

您有两种选择:

>

  • 将字段重命名为iap,保持注释不变。
    推荐使用,因为这遵循Java命名标准。

    @JsonAutoDetect(getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
    

    这阻止了Jackson从getter方法自动检测属性,即只有带有@jsonproperty注释的getter方法才会定义属性。由于Lombok创建的getter中没有一个具有该注释,因此其效果是只有带注释的字段才会定义属性。

  •  类似资料:
    • 问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。

    • 杰克逊v1。9.13 spring 3.2.0嗨,我花了好几天的时间试图弄清楚如何在序列化期间从bean向JSON中添加字段。 这似乎是一个非常基本的功能,但我每走一条路都会碰到橡胶墙。 我想要实现的是: 示例bean: 输出: 我认为最简单的方法是扩展BeanSerializer,编写“_type”属性,并委托剩余字段的超类序列化。问题是,方法的可访问性和一些关键方法的“最终”条款使其陷入困境。

    • 问题内容: 我正在阅读“有效Java”中的序列化一章。我试图理解本书中的以下段落。 如果使用可序列化和可扩展的实例字段实现类,则应注意这一点。如果该类具有将其实例字段初始化为其默认值(整数类型为零,布尔值为false,对象引用类型为null)而将被违反的不变量,则必须将此readObjectNoData方法添加到该类: 我不确定上述陈述的含义。 为了测试这一点,我创建了一个Person类(可序列化

    • 在我们的项目(springMVC)Rest API项目中,我希望只对请求和响应使用一个模型(以避免添加大量代码将字段从一个对象复制到另一个对象) 我想用昂首阔步来处理所有的医生,但我遇到了一个小问题。例如,假设我有一个模型用户 和一个简单的控制器 现在,我希望swagger在反序列化时隐藏属性密码,而不是序列化(因此,在输入时显示它,但在输出时显示它),在Id字段中则相反。 我尝试使用@jsoni

    • 问题内容: 我有一个包含a 和a的类。现在,我想使用gson序列化对象,但排除该字段。 如您所见,我已经尝试使用,但是似乎没有任何作用。另外,我已经将该字段设置为私有,因为我认为这会“覆盖” 但运行以下代码: 仍然会导致以下文件内容没有错误: 那我在做什么错?我现在一无所知,并且希望得到任何帮助,因为这似乎行不通。 提前致谢。 问题答案: 为了获得此结果,您需要使用注释所有字段: 并将Gson配置

    • 我试图基于我的对象类POJO创建一个JSON。对于某些字段,我想使用CustomSerializer,因为我想根据我的需求创建字段。因此,我创建了。 将由我的中的两个不同字段调用,我希望根据哪个字段进行调用来处理不同的事情。对于其中一个字段(),我希望使用,而对于其他字段(),我不希望在JSON中使用。 我面临的问题是,当调用时,对于这两个调用,我得到的,由于无法区分哪个字段当前正在调用。 下面的