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 是我推荐的解决方案的好网站。
字符串变量 - 以下示例中的 "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 是我推荐的解决方案的好网站。