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

Jackson JSONDeserialize+Builder具有不同的字段名?

夹谷浩博
2023-03-14

我对使用Jackson还是个新手,我正在尝试遵循我的团队的模式来反序列化我们的JSON。现在我遇到了一个问题,当一个字段名与JSON属性不匹配时。

工作示例:

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
@Value
@ParametersAreNonnullByDefault
@Builder(builderClassName = "Builder")
private static class ProfilePrimaryData {
    private final Boolean hasProfile;

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {
    }
}

如果JSON属性是hasProfile,它工作得很好,但是如果是has_profile(这是我们的客户端正在编写的内容),它就不工作了,并且我得到一个错误:无法识别的字段“has_profile”(类com.mypackagehere.something.$profilePrimaryData$builder),没有标记为可忽略(一个已知属性:“hasProfile”])。我尝试向hasProfile添加JsonProperty注释,但仍然不起作用:

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
@Value
@ParametersAreNonnullByDefault
@Builder(builderClassName = "Builder")
private static class ProfilePrimaryData {
    @JsonProperty("has_profile")
    private final Boolean hasProfile;

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {
    }
}

我是不是误会了这是怎么回事?

共有1个答案

臧令
2023-03-14

错误明确指出无法识别的字段“has_profile”(类com.mypackagehere.something.$profilePrimaryData$Builder)
Builder类中缺少has_profile,而不是profilePrimaryData类,因此必须注释生成器类属性。

@JsonDeserialize(builder = ProfilePrimaryData.Builder.class)
public class ProfilePrimaryData {

    /*
     * This annotation only needed, if you want to
     * serialize this field as has_profile,
     * 
     * <pre>
     * with annotation
     * {"has_profile":true}
     * 
     * without annotation
     * {"hasProfile":true}
     * <pre>
     *  
     */
    //@JsonProperty("has_profile")
    private final Boolean hasProfile;

    private ProfilePrimaryData(Boolean hasProfile) {
        this.hasProfile = hasProfile;
    }

    public Boolean getHasProfile() {
        return hasProfile;
    }

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {

        // this annotation is required
        @JsonProperty("has_profile")
        private Boolean hasProfile;

        public Builder hasProfile(Boolean hasProfile) {
            this.hasProfile = hasProfile;
            return this;
        }

        public ProfilePrimaryData build() {
            return new ProfilePrimaryData(hasProfile);
        }
    }
}
 类似资料:
  • 我正在探索GraphQL,想知道是否有任何重命名响应字段的方法,例如我有一个POJO与这些字段 GraphQL查询: 我的回答是这样的 我是否可以将名称字段重命名为类似用户名的名称,以便我的回答如下

  • 我想在更深层次的继承中为一个类实现构建器模式,其中一些字段是强制性的(message,case),而一些字段是可选的(myOptField1,MyOptField2…)通过使用Lombok@Builder并假设父类不能更改。因此,我实现了自己的builder(),如下所示: 那么这个类的使用方式可以是: 在IntelliJ的想法中,一切似乎都很好,但我得到了编译错误: 因此编译器只能看到由Lomb

  • 我有两个名为Site和AppSite的对象,两个对象都有如下相同的字段。是否有任何util类将所有字段从AppSite复制到站点,如BeanUtils。copyProperties。 如果你看到上面的两个pojo,我有两个对象字段列表。两个对象也一样,只有Site和AmsSite对象。有相同的字段名,但不同的类名。 BeanUtils.copy属性是将所有文字字段值从AppSite正确复制到Sit

  • Java类(用作数据传输对象): 类资源还有一个名为的字段,它的getter和setter具有不同的类型,因此出现语法错误。 由于上面的类是一个DTO,一个JSON响应(带有字段)将映射到它,并且不能使用getId(),我想将字段更改为,并相应地更改getter和setter,并用一个注释标记它,说明bind this to字段。 注意:我用的是Spring靴。我尝试使用@JSONProperty

  • 问题内容: 我在Google Cloud Firestore中的查询条件有问题。 下面是我的代码,以获得第一个以HA_开头的文档并按ID DESC排序 我想获取文章ID为“ HA_”或“ XE_”开头的文章的最后ID 例如上图: if(articleId以“ HA_”开头)=>返回id 831的对象 if(articleId以“ XE_”开头)=>返回ID为833的对象 现在我得到一个错误 jav

  • 我将游戏状态存储在MongoDB数据库中,并使用Spring数据来管理数据库交互。我是Spring Data的新手,不确定如何处理下面的场景。 我有一个“游戏”类型的文档,带有一堆属性,如id,时间戳等。这些属性之一是用户采取的操作列表。这些行动的形式如下: