【问题标题】:Display Class Name instead of object in resultant Json Response在结果 Json 响应中显示类名称而不是对象
【发布时间】:2019-12-19 12:04:51
【问题描述】:

我有一个通用类Result<R> 和一个类JsonResponse

public class JsonResponse {
    private boolean success;
    private Result result; //getter/settter
}

在我的 api 中,我返回类 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

预期输出:

【问题讨论】:

  • 能把解析JsonResponse的代码贴成JSON格式还是发给客户端?
  • 能否请您更新您的问题并发布整个方法?也不要添加图片,而是仅以文本形式发布内容。

标签: java json api generics jsonresponse


【解决方案1】:

如果你使用Jackson,你可以创建一个自定义的序列化器来实现这一点。

类 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) 添加到您的班级JsonResponse,如下所示。

@JsonSerialize(using = CustomSerializer.class)
public class JsonResponse {
    private boolean success;
    private Result<?> result;

    //general getters ans setters
}

验证码sn-p

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":{"约束":{"cutOffTime":"2019-12-19T20:59:59.059","currentTime":"2019-12-19T16:51:08.970 ","isDeliveryPossible":false}}}

【讨论】:

  • 谢谢,解决方案有效。有没有办法将对象重命名为类的注释值中的名称?
  • @Aarti Goel 嗨,我认为这应该是另一个问题。顺便说一句,如果它解决了您的问题,请接受我的帖子作为答案,谢谢!
  • @Aarti Goel 谢谢!听起来您不想用类名重命名它?如果是,我认为您应该为此创建一个新问题。
猜你喜欢
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多