我可以仅将 java.util.Optional 中的值序列化为 json 吗?
Could i serialize into a json only the value from a java.util.Optional?
我面临以下问题:我有一个 class 作为数据成员 java.util.Optional 对象,我需要将其转换为 json。
代码看起来像这样的通用方式:
public class MyClass{
public java.util.Optional<MyCustomObject> object;
public Myclass(java.util.Optional<MyCustomObject> object){
this.object = object;
}
public java.util.Optional<MyCustomObject> getObject(){
return this.object;
}
public void setObject(java.util.Optional<MyCustomObject> object){
return this.object = object;
}
}
当我把它变成 json 我得到这样的东西:
Optional[
object
]
我想从 json 中删除可选部分。
我可以这样做吗?
有多个 Java 库可用于 serialization/deserialization。其中之一是 excellent Jackson library,您可以在其中以细粒度的方式调整序列化。
如果您拥有 POJO 的源代码MyClass
,您只需添加一些注释即可使其正常工作。
如果您假设 MyCustomObject
看起来像这样:
public class MyCustomObject {
private final String myVal;
public MyCustomObject(String myVal) {
this.myVal = myVal;
}
public String getMyVal() {
return myVal;
}
}
然后,您的 MyClass
对象可以这样声明(注意 annotations @JsonIgnore
和 @JsonProperty
):
public class MyClass {
private Optional<MyCustomObject> object;
public MyClass(Optional<MyCustomObject> object) {
this.object = object;
}
// Ignore the "normal" serialization
@JsonIgnore
public Optional<MyCustomObject> getObject() {
return this.object;
}
public void setObject(Optional<MyCustomObject> object) {
this.object = object;
}
// This handles the serialization
@JsonProperty("object")
private MyCustomObject getObjectAndYesThisIsAPrivateMethod() {
return getObject().orElse(null);
}
}
最后可以使用下面的代码序列化为JSON:
ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(
new MyClass(Optional.ofNullable(new MyCustomObject("Yes, my value!"))));
上面代码中的 magic 在于使用 ObjectMapper 处理数据绑定,即在 POJO 和 JSON 之间转换(反之亦然反之亦然)。
另一种方法,如果您不拥有 MyClass
class 的源代码,即您无法修改它,那就是创建自定义序列化程序 as described in the Jackson docs.
我面临以下问题:我有一个 class 作为数据成员 java.util.Optional 对象,我需要将其转换为 json。 代码看起来像这样的通用方式:
public class MyClass{
public java.util.Optional<MyCustomObject> object;
public Myclass(java.util.Optional<MyCustomObject> object){
this.object = object;
}
public java.util.Optional<MyCustomObject> getObject(){
return this.object;
}
public void setObject(java.util.Optional<MyCustomObject> object){
return this.object = object;
}
}
当我把它变成 json 我得到这样的东西:
Optional[
object
]
我想从 json 中删除可选部分。 我可以这样做吗?
有多个 Java 库可用于 serialization/deserialization。其中之一是 excellent Jackson library,您可以在其中以细粒度的方式调整序列化。
如果您拥有 POJO 的源代码MyClass
,您只需添加一些注释即可使其正常工作。
如果您假设 MyCustomObject
看起来像这样:
public class MyCustomObject {
private final String myVal;
public MyCustomObject(String myVal) {
this.myVal = myVal;
}
public String getMyVal() {
return myVal;
}
}
然后,您的 MyClass
对象可以这样声明(注意 annotations @JsonIgnore
和 @JsonProperty
):
public class MyClass {
private Optional<MyCustomObject> object;
public MyClass(Optional<MyCustomObject> object) {
this.object = object;
}
// Ignore the "normal" serialization
@JsonIgnore
public Optional<MyCustomObject> getObject() {
return this.object;
}
public void setObject(Optional<MyCustomObject> object) {
this.object = object;
}
// This handles the serialization
@JsonProperty("object")
private MyCustomObject getObjectAndYesThisIsAPrivateMethod() {
return getObject().orElse(null);
}
}
最后可以使用下面的代码序列化为JSON:
ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(
new MyClass(Optional.ofNullable(new MyCustomObject("Yes, my value!"))));
上面代码中的 magic 在于使用 ObjectMapper 处理数据绑定,即在 POJO 和 JSON 之间转换(反之亦然反之亦然)。
另一种方法,如果您不拥有 MyClass
class 的源代码,即您无法修改它,那就是创建自定义序列化程序 as described in the Jackson docs.