在结果 Json 响应中显示 Class 名称而不是对象
Display Class Name instead of object in resultant Json Response
我有一个通用的 class Result<R>
和一个 class JsonResponse
public class JsonResponse {
private boolean success;
private Result result; //getter/settter
}
在我的 api 中,我正在为 class ProductDeliveryCounter
返回 json 响应
Constraint constraint= getDeliveryCounter();
JsonResponse returnObject=new JsonResponse();
Result<Constraint> proMap=new Result<Constraint>(constraint);
returnObject.setResult(proMap);
returnObject.setSuccess(true); return returnObject;
输出:
提问:有什么方法可以把图片中的object
改成constraint
预期输出:
如果您正在使用 Jackson
,您可以创建自定义序列化程序来实现此目的。
Class CustomSerializer
class CustomSerializer extends JsonSerializer<JsonResponse> {
@Override
public void serialize(JsonResponse value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeBooleanField("success", value.isSuccess());
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.convertValue(value.getResult().getObject(), JsonNode.class);
JsonNode rootNode = mapper.createObjectNode();
((ObjectNode) rootNode).set(value.getResult().getObject().getClass().getSimpleName(), node);
jgen.writeObjectField("result", rootNode);
jgen.writeEndObject();
}
}
然后将 @JsonSerialize(using = CustomSerializer.class)
添加到您的 class JsonResponse
中,如下所示。
@JsonSerialize(using = CustomSerializer.class)
public class JsonResponse {
private boolean success;
private Result<?> result;
//general getters ans setters
}
验证代码段
Constraint constraint = new Constraint();
constraint.setCutOffTime("2019-12-19T20:59:59.059");
constraint.setCurrentTime("2019-12-19T16:51:08.970");
constraint.setDeliveryPossible(false);
Result<Constraint> result = new Result<>(constraint);
JsonResponse returnObject = new JsonResponse();
returnObject.setSuccess(true);
returnObject.setResult(result);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(returnObject));
控制台输出
{"success":true,"result":{"Constraint":{"cutOffTime":"2019-12-19T20:59:59.059","currentTime":"2019-12-19T16:51:08.970","isDeliveryPossible":false}}}
我有一个通用的 class Result<R>
和一个 class JsonResponse
public class JsonResponse {
private boolean success;
private Result result; //getter/settter
}
在我的 api 中,我正在为 class ProductDeliveryCounter
返回 json 响应Constraint constraint= getDeliveryCounter();
JsonResponse returnObject=new JsonResponse();
Result<Constraint> proMap=new Result<Constraint>(constraint);
returnObject.setResult(proMap);
returnObject.setSuccess(true); return returnObject;
输出:
提问:有什么方法可以把图片中的object
改成constraint
预期输出:
如果您正在使用 Jackson
,您可以创建自定义序列化程序来实现此目的。
Class CustomSerializer
class CustomSerializer extends JsonSerializer<JsonResponse> {
@Override
public void serialize(JsonResponse value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeBooleanField("success", value.isSuccess());
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.convertValue(value.getResult().getObject(), JsonNode.class);
JsonNode rootNode = mapper.createObjectNode();
((ObjectNode) rootNode).set(value.getResult().getObject().getClass().getSimpleName(), node);
jgen.writeObjectField("result", rootNode);
jgen.writeEndObject();
}
}
然后将 @JsonSerialize(using = CustomSerializer.class)
添加到您的 class JsonResponse
中,如下所示。
@JsonSerialize(using = CustomSerializer.class)
public class JsonResponse {
private boolean success;
private Result<?> result;
//general getters ans setters
}
验证代码段
Constraint constraint = new Constraint();
constraint.setCutOffTime("2019-12-19T20:59:59.059");
constraint.setCurrentTime("2019-12-19T16:51:08.970");
constraint.setDeliveryPossible(false);
Result<Constraint> result = new Result<>(constraint);
JsonResponse returnObject = new JsonResponse();
returnObject.setSuccess(true);
returnObject.setResult(result);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(returnObject));
控制台输出
{"success":true,"result":{"Constraint":{"cutOffTime":"2019-12-19T20:59:59.059","currentTime":"2019-12-19T16:51:08.970","isDeliveryPossible":false}}}