在Java中将JSON原语映射到对象值
我有以下几个问题在Java中将JSON原语映射到对象值,java,json,jackson,Java,Json,Jackson,我有以下几个问题 { id: 1234, code: "N/A" } 我想将其转换为此类类的对象: class MySweetObject { int id; SomeStringWrapper code; } class SomeStringWrapper { String code; Boolean isNotAvailable() { return "N/A".equals(code); } } 简言之,我想将JSON中的简单属性值包装到对象中,
{
id: 1234,
code: "N/A"
}
我想将其转换为此类类的对象:
class MySweetObject {
int id;
SomeStringWrapper code;
}
class SomeStringWrapper {
String code;
Boolean isNotAvailable() {
return "N/A".equals(code);
}
}
简言之,我想将JSON中的简单属性值包装到对象中,以添加一些业务功能。空值不是选项,因为
code
是必需的属性
可以在Jackson中执行此操作吗?请尝试以下代码:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.javafx.fxml.PropertyNotFoundException;
class Main {
public static void main(String[] args) throws Exception {
String jsonString = "{\"id\":\"1234\"}";
ObjectMapper mapper = new ObjectMapper();
MySweetObject obj = mapper.readValue(jsonString, MySweetObject.class);
System.out.println(mapper.writeValueAsString(obj));
}
}
class MySweetObject {
private String id;
private String code;
public String getId() {
return id;
}
public String getCode() {
if (code == null) {
throw new PropertyNotFoundException("Property code cannot be null");
} else {
return code;
}
}
}
通常@JsonProperty(required=true)
会抛出异常,但它不起作用,相反,如果属性为null或为空,您可以在getter中手动抛出异常。检查上面的我的代码,如果为空,它将抛出JsonMappingException
。您可以在setCode
方法中使用注释:
从文件中:
Setter表示当在中遇到具有匹配名称的属性时
JSON内容,此方法将用于设置属性的值
通过这种方式,您可以在设置前检查值是否为
null
,如果为null
,则设置默认值(或执行任何您想要的操作)。您需要修改JSON字符串,根据您的类,它是错误的。作为值“N/A”,jackson将假定它是字符串
,但这是SomeStringWrapper
类的实例。为了反序列化到类结构,JSON应该如下所示:
{
id: 1234,
code: {
code : "N/A"
}
}
在构造函数中初始化它?我知道。我想实现的是让Jackson将这个精确的属性映射到包装字符串
code
属性我提到了code
值是必需的,并且永远不能为空。这个问题的主要目的是为包装值中的特定值(如“N/A”
)添加额外的逻辑。并且不检查code
是否为空。这不是问题你只是编辑了你的问题,所以是的。。。而不是检查空值,你可以做你想做的。。。这就是“空值不是选项,因为代码是必需的属性。”如果这不需要空检查,那么它是什么?你需要检查null和emptyThanks mate!作品如果JSON数据中根本没有属性code
,这将不起作用。在官方文档中:Setter意味着当在JSON内容中遇到具有匹配名称的属性时,将使用此方法设置该属性的值。
@Thomas.L是的,您是对的,但据我所知,他在json中总是有code
属性,在某些情况下,这个属性的值为null
@amicoderozer如果我的根对象中有一个SomeStringWrapper的集合,你知道如何实现同样的效果吗?