【问题标题】:Object value as null in Jackson Parsing杰克逊解析中的对象值为空
【发布时间】:2015-04-29 11:58:25
【问题描述】:

我正在使用 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);
    }
}

现在,我这样称呼它:

第一种情况 在没有会员地图的情况下通话:

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

process 方法被调用,因为 Jackson 被告知在获得 ZADD 命令时创建 ZAddBaseOperationRequest 的对象,所以它正在执行它,但 command 本身的值在结果对象中被分配为 null

请解释为什么? command的价值去哪儿了?

第二种情况 与会员地图通话: :/.../process/[{"members":{"a":1.0},"operationId":1,"command":"ZADD","gameId":"t5","key":"abc "}]

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

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

请帮忙。

【问题讨论】:

    标签: java json spring rest jackson


    【解决方案1】:

    将 json 作为路径参数发送不是一个好习惯。

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

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

    根据visible 的杰克逊文档:

    定义类型标识符值是作为 JSON 流的一部分传递给反序列化器 (true) 还是由 TypeDeserializer 处理和删除 (false) 的属性。 默认值为 false,这意味着 Jackson 会处理并从传递给 JsonDeserializer 的 JSON 内容中删除类型标识符。

    【讨论】:

    • 感谢您的回答和建议,我知道它的坏习惯,这就是为什么我也写了,无论如何您的解决方案有效,+1 但因为其他部分没有回答,这就是为什么不接受:)
    • 另一部分是什么?
    • @ankurverma 你能发布场景二的准确输入和输出吗?根据您的问题,我无法正确理解。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多