POJO 到 JSON 的转换不适用于以 "is" 开头的字符串变量

POJO to JSON conversion not working for String variable starting with "is"

字符串变量 - 以下示例中的 "isInitial" 未转换为 JSON。是否可以在不修改 EmployeePOJO class?

的情况下为 isInitial 变量生成 JSON 结构

PS: converting the getter method to getIsInitial works.

请在下面找到用于生成 JSON 的 POJO class:

public class EmployeePOJO {
    private String firstName;
    private String lastName;
    private String isInitial;
    private boolean isFirstNameAvailable;
    private boolean hasLastNameAvailable;
    private String hasHouse;


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String isInitial()
    {
        return this.isInitial;
    }

    public void setInitial(String pInitial)
    {
        this.isInitial = pInitial;
    }

    public String getHasHouse() {
        return hasHouse;
    }

    public void setHasHouse(String hasHouse) {
        this.hasHouse = hasHouse;
    }

    public boolean isFirstNameAvailable() {
        return isFirstNameAvailable;
    }

    public void setFirstNameAvailable(boolean firstNameAvailable) {
        isFirstNameAvailable = firstNameAvailable;
    }

    public boolean isHasLastNameAvailable() {
        return hasLastNameAvailable;
    }

    public void setHasLastNameAvailable(boolean hasLastNameAvailable) {
        this.hasLastNameAvailable = hasLastNameAvailable;
    }
}

POJO转换的主要逻辑如下:

import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;

public class JacksonPojoToJson {
    public static void main(String[] args) throws IOException {
        // Create ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        EmployeePOJO employeePOJO = new EmployeePOJO();
        employeePOJO.setFirstName("FIRST NAME");
        employeePOJO.setFirstNameAvailable(true);
        employeePOJO.setLastName("last name");
        employeePOJO.setHasLastNameAvailable(true);
        employeePOJO.setInitial("true");

        // Convert object to JSON string
        String json = mapper.writeValueAsString(employeePOJO);
        System.out.println(json);
    }
}

原因是 boolean 变量的 setters/getters 不遵循模式 setVariableName/getVariableName.

你可以在自己的代码中看到它是这样的:

public String isInitial()
{
    return this.isInitial;
}

public void setInitial(String isInitial)
{
    this.isInitial = isInitial;
}

快速解决方法是手动为布尔变量创建 setters/getters。 这个(setter/getter 创建问题)通常发生在 eclipse 中,但我认为 IntelliJ 可以正确处理这个问题。

错误的命名约定。如果您使用 IDE 让 IDE 为您生成 getters 和设置器。

isInitial 方法可用作布尔变量的 getter。不是字符串变量。

所以你可以修复你的 POJO class (https://en.wikipedia.org/wiki/Plain_old_Java_object)

或者您可以使用 @JsonProperty 注释 (https://fasterxml.github.io/jackson-annotations/javadoc/2.8/com/fasterxml/jackson/annotation/JsonProperty.html)

使用 Lombok maven 依赖项自动生成 getter & setter。

您必须为变量使用正确的 getter 和 setter 命名,例如:

private String isInitial;

对于上面的变量getter setter应该是:

public String getIsInitial()
{
    return this.isInitial;
}

public void setIsInitial(String isInitial)
{
    this.isInitial = isInitial;
}

注意:我不知道您的用例,但像 isXXXX 这样的名称用于 getter 个布尔变量。

我建议使用 Lombok 的 @Getter@Setter 注释来自动生成您的 getter 和 setter 方法。使用这些,您将不会 运行 陷入命名约定等问题。

请参阅以下URL了解更多信息: https://projectlombok.org/features/GetterSetter

@Loizos - 非常感谢 @JsonProperty 的建议,效果很好。我正在寻找一个没有修改 class - EmployeePOJO 的解决方案(因为它是我们不想触及的遗留代码)。

我通过使用 Mixins 解决了这个问题,它不需要在 EmployeePOJO 文件中进行修改。

对我有用的示例代码:

public interface EmployeePOJOMixIn {

    @JsonProperty("isInitial")
    public abstract String isInitial();
}

然后将此 Mixin 添加到映射器(这将根据您使用的是 fasterxml 还是 codehaus 而有所不同)

https://www.leveluplunch.com/java/tutorials/024-modifying-fields-external-domain-jackson-mixin/ and https://medium.com/@shankar.ganesh.1234/jackson-mixin-a-simple-guide-to-a-powerful-feature-d984341dc9e2 是我推荐的解决方案的好网站。