【问题标题】:Partially deserialize a json object in a restful post call在一个安静的帖子调用中部分反序列化一个 json 对象
【发布时间】:2012-06-23 02:08:29
【问题描述】:

我正在尝试在 springmvc 中获取一个方法来接受对象的部分 json 字符串,并让 jackson 自动为我反序列化它。 我可以通过制作一个仅包含我想要的属性的临时对象来解决它,或者将它作为字符串传递并使用 Gson 为我反序列化它,但是这些感觉很hacky。有没有办法告诉杰克逊怎么做?

这里是控制器sn-p:

@RequestMapping(value = "/task", 
    method = RequestMethod.POST,
    consumes="application/json")
public @ResponseBody String postTask(@RequestBody Task task){
    if(task.getId() == null){
        task.setId(UUID.randomUUID());
    }
    if(task.getDate_entered() == 0){
        task.setDate_entered(System.currentTimeMillis());
    }
    TaskDao.addTask(task);
    return "success";
} 

还有任务,一个基本的pojo:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class Task {
    private UUID id;
    private String name;
    private String description;
    private long date_entered;
    private long finish_by;

    public UUID getId() {
        return id;
    }
    public void setId(UUID id) {
        this.id = id;
    }
    // Rest of the getters and setters
}

如果您无法通过我的其他与春季相关的问题来判断,我有点盲目,无法找出适合这个问题的谷歌查询。

谢谢!

【问题讨论】:

  • 根据 Jackson 文档,这种行为应该是标准的。 IE。如果属性没有值,则不会调用它的 setter,但仍会创建对象。见jackson-users.ning.com/forum/topics/…
  • 哦不!如果是这种情况,那么我要么使用旧版本,要么设置错误。我将尝试确认两者。谢谢
  • @Awalsh:aannnddd 今天早上它按预期工作......不完全确定我之前更改了什么来启用/禁用它。我会尝试找出发生了什么变化并将其作为答案。

标签: java json spring spring-mvc jackson


【解决方案1】:

您需要在要忽略序列化和/或反序列化的方法或字段上使用杰克逊的@JsonIgnoreannotation(反序列化的setter和序列化的getter)或字段。例如 在您的示例中,如果您不想序列化description,那么您可以这样做,

@JsonIgnore
public void setDescription(String description) {
        this.description = description;
 }

您会看到,您不会在转换后的模型中获得description 的值。

【讨论】:

  • 这是否允许即时选择要反序列化的内容?例如,您可以传递一次 UUID,然后只传递名称?
  • 有了这个配置,NO。因为我们在类定义本身中进行了注释,我认为不可能即时更改类定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多