Tim*_*Tim 24 java json jackson
我想序列化一个对象,以便根据字段的类型对其中一个字段进行不同的命名.例如:
public class Response {
private Status status;
private String error;
private Object data;
[ getters, setters ]
}
Run Code Online (Sandbox Code Playgroud)
在这里,我希望将字段data序列化为类似的东西,data.getClass.getName()而不是始终data根据情况调用包含不同类型的字段.
我如何使用Jackson实现这样的技巧?
Joã*_*lva 32
使用自定义JsonSerializer.
public class Response {
private String status;
private String error;
@JsonProperty("p")
@JsonSerialize(using = CustomSerializer.class)
private Object data;
// ...
}
public class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeObjectField(value.getClass().getName(), value);
jgen.writeEndObject();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,假设您要序列化以下两个对象:
public static void main(String... args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Response r1 = new Response("Error", "Some error", 20);
System.out.println(mapper.writeValueAsString(r1));
Response r2 = new Response("Error", "Some error", "some string");
System.out.println(mapper.writeValueAsString(r2));
}
Run Code Online (Sandbox Code Playgroud)
第一个将打印:
{"status":"Error","error":"Some error","p":{"java.lang.Integer":20}}
Run Code Online (Sandbox Code Playgroud)
第二个:
{"status":"Error","error":"Some error","p":{"java.lang.String":"some string"}}
Run Code Online (Sandbox Code Playgroud)
我已经使用了p包装器对象的名称,因为它只是用作placeholder.如果要删除它,则必须为整个类编写自定义序列化程序,即a JsonSerializer<Response>.
tlo*_*bon 21
我有一个使用@JsonAnyGetter注释的简单解决方案,它就像一个魅力.
import java.util.Collections;
import java.util.Map;
public class Response {
private Status status;
private String error;
@JsonIgnore
private Object data;
[getters, setters]
@JsonAnyGetter
public Map<String, Object> any() {
//add the custom name here
//use full HashMap if you need more than one property
return Collections.singletonMap(data.getClass().getName(), data);
}
}
Run Code Online (Sandbox Code Playgroud)
不需要包装器,不需要自定义序列化器.
小智 5
我自己的解决方案。
@Data
@EqualsAndHashCode
@ToString
@JsonSerialize(using = ElementsListBean.CustomSerializer.class)
public class ElementsListBean<T> {
public ElementsListBean()
{
}
public ElementsListBean(final String fieldName, final List<T> elements)
{
this.fieldName = fieldName;
this.elements = elements;
}
private String fieldName;
private List<T> elements;
public int length()
{
return (this.elements != null) ? this.elements.size() : 0;
}
private static class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
JsonProcessingException
{
if (value instanceof ElementsListBean) {
final ElementsListBean<?> o = (ElementsListBean<?>) value;
jgen.writeStartObject();
jgen.writeArrayFieldStart(o.getFieldName());
for (Object e : o.getElements()) {
jgen.writeObject(e);
}
jgen.writeEndArray();
jgen.writeNumberField("length", o.length());
jgen.writeEndObject();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39960 次 |
| 最近记录: |