杰克逊通过删除'is'重命名原始布尔字段

iCo*_*ode 64 java json jackson

这可能是重复的.但我无法找到解决问题的方法.

我上课了

public class MyResponse implements Serializable {

    private boolean isSuccess;

    public boolean isSuccess() {
        return isSuccess;
    }

    public void setSuccess(boolean isSuccess) {
        this.isSuccess = isSuccess;
    }
}
Run Code Online (Sandbox Code Playgroud)

Eclipse生成getter和setter.

在另一个类中,我将值设置为true,并将其写为JSON字符串.

System.out.println(new ObjectMapper().writeValueAsString(myResponse));
Run Code Online (Sandbox Code Playgroud)

在JSON中,关键是即将到来{"success": true}.

我希望密钥isSuccess本身.Jackson是否在序列化时使用setter方法?如何使密钥成为字段名称本身?

小智 82

这是一个稍晚的答案,但对于访问此页面的其他人可能会有用.

更改Jackson在序列化为JSON时将使用的名称的简单解决方案是使用@JsonProperty注释,因此您的示例将变为:

public class MyResponse implements Serializable {

    private boolean isSuccess;

    @JsonProperty(value="isSuccess")        
    public boolean isSuccess() {
        return isSuccess;
    }

    public void setSuccess(boolean isSuccess) {
        this.isSuccess = isSuccess;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其序列化为JSON {"isSuccess":true},但具有不必修改getter方法名称的优点.

请注意,在这种情况下,您还可以编写注释,@JsonProperty("isSuccess")因为它只有单个value元素

  • 我将 spring boot 与 jackson 一起使用,但得到两个字段,一个是“成功”,另一个是“isSuccess”,当我使用非原始布尔值时,只有一个字段“isSuccess” (11认同)

小智 18

我最近碰到了这个问题,这就是我发现的.杰克逊将检查您传递给它的任何类别的getter和setter,并使用这些方法进行序列化和反序列化.这些方法中的"get","is"和"set"之后的内容将用作JSON字段的键(getIsValid和setIsValid的"isValid").

public class JacksonExample {   

    private boolean isValid = false;

    public boolean getIsValid() {
        return isValid;
    }

    public void setIsValid(boolean isValid) {
        this.isValid = isValid;
    }
} 
Run Code Online (Sandbox Code Playgroud)

类似地,"isSuccess"将变为"成功",除非重命名为"isIsSuccess"或"getIsSuccess"

在这里阅读更多:http://www.citrine.io/blog/2015/5/20/jackson-json-processor

  • isValid对于java中的布尔数据类型的命名约定不正确.应该是有效的isValid(),setValid() (5认同)
  • 难道不应该是那样吗?约定?如果确实存在,是否可以链接到Jackson引用,该引用说它使用getter名称作为JSON字段?还是您认为这是一个糟糕的设计选择? (2认同)
  • 我希望有一个警告 (2认同)

Fab*_*bio 15

使用下面的两个注释,强制输出 JSON 包括is_xxx

@get:JsonProperty("is_something")
@param:JsonProperty("is_something")
Run Code Online (Sandbox Code Playgroud)

  • 那是Java吗?也许是科特林? (3认同)

Eir*_*sse 9

当您使用 Kotlin 和数据类时:

data class Dto(
    @get:JsonProperty("isSuccess") val isSuccess: Boolean
)
Run Code Online (Sandbox Code Playgroud)

@param:JsonProperty("isSuccess")如果您还打算反序列化 JSON,则可能需要添加。


bur*_*mre 7

您可以ObjectMapper按如下方式配置:

mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() {
            @Override
            public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName)
            {
                if(method.hasReturnType() && (method.getRawReturnType() == Boolean.class || method.getRawReturnType() == boolean.class)
                        && method.getName().startsWith("is")) {
                    return method.getName();
                }
                return super.nameForGetterMethod(config, method, defaultName);
            }
        });
Run Code Online (Sandbox Code Playgroud)


小智 7

我不想搞乱一些自定义命名策略,也不想重新创建一些访问器。
代码越少,我就越高兴。

这对我们来说是成功的:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties({"success", "deleted"}) // <- Prevents serialization duplicates 
public class MyResponse {

    private String id;
    private @JsonProperty("isSuccess") boolean isSuccess; // <- Forces field name
    private @JsonProperty("isDeleted") boolean isDeleted;

}
Run Code Online (Sandbox Code Playgroud)