java - Jackson 解析中对象值为 null

标签 java json spring rest jackson

我正在使用 Jackson 库并试图实现提到的 here

BaseOperationRequest.java

@JsonTypeInfo(
   use = JsonTypeInfo.Id.NAME,
   include = JsonTypeInfo.As.PROPERTY,
   property = "command"
)
@JsonSubTypes({
   @JsonSubTypes.Type(name = "ZADD", value = ZAddBaseOperationRequest.class)
})
public class BaseOperationRequest {
   public short operationId;
   public Command command;
   public String gameId;
   public String key;
}

ZAddBaseOperationRequest.java

public class ZAddBaseOperationRequest extends BaseOperationRequest{
   public Map<String, Double> members;
}

Command.java

public enum Command{
  ZADD,
  HSET
}

当我尝试从 REST 调用传递对象时,问题就出现了,如下所示:

@RestController
public class MyController{
   //keeping just for now as GET, will change it to POST and take it in RequesBody later on
   @RequestMapping(value = "/process/{object}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody ResponseEntity process(@Pathvariable String object){
        System.out.println(object);//I am getting this as correct--->(A)
        BaseOperationRequest[] baseOperationRequestArray = new ObjectMapper().readValue(object, BaseOperationRequest[].class);//getting exception --->(B)
        System.out.println(baseOperationRequestArray);
    }
}

现在,我这样调用它:

第一种情况 无成员(member) map 通话:

<server>:<port>/.../process/[{"operationId":1,"command":"ZADD","gameId":"t5","key":"abc"}]

正在调用process方法,并且由于Jackson被告知在命令ZADD时创建ZAddBaseOperationRequest的对象,因此它正在执行但 command 本身的值在结果对象中被指定为 null

请解释一下为什么? command 的值到哪里去了?

第二种情况 与成员(member)通话 map : :/.../process/[{"members":{"a":1.0},"operationId":1,"command":"ZADD","gameId":"t5","key":"abc “}]

那么在这种情况下,等式 (A) 显示[{"members":{"a":1.0,b 就是这样,GET 的其他部分去了哪里。

这让我很生气。 :)。 提前致谢..

请帮忙。

最佳答案

It is not a good practice to send json as path parameter.

要解决您的问题,请在 JsonTypeInfo 注释中添加 visible=true 。您的声明将变为:

@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = JsonTypeInfo.As.PROPERTY,
  property = "command",
  visible = true
)

根据 visible 的 jackson 文档:

Property that defines whether type identifier value will be passed as part of JSON stream to deserializer (true), or handled and removed by TypeDeserializer (false). Default value is false, meaning that Jackson handles and removes the type identifier from JSON content that is passed to JsonDeserializer.

关于java - Jackson 解析中对象值为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29943072/

相关文章:

java - 哪个是 fork 嵌套对象列表列表的有效方法? java 8平面图与每个?

java - 我不明白为什么我的 java 扫描仪抛出 "NoSuchElementException"

php - 如何将json数组插入mysql数据库

java - 从 Spring Boot 1.3.3 -> 1.3.5 升级时嵌入式 tomcat 无法启动

java - 使用 H2 和 Hibernate 的 Spring JPA 无法正确自动增量

java - HQL查询——通过连接关系拉取数据

java - 选择OneToMany查询jpql

json - 导出 JSON 数据并加载到关系数据库中

json - 从JSON列表中获取数据

spring - RestTemplate 在获取请求时给出 400 Bad Request 错误