从Json deseralization获取Java中的对象所需的值

时间:2016-03-04 13:11:02

标签: java playframework jackson

我需要在PlayFramework中从Json创建对象。

 Example example =  Json.fromJson( request().body().asJson() , Example.class);

但我需要始终拥有对象中的所有值。

class Example{
  @Required_from_Json public String name;
  @Required_from_Json public boolen dead;
  @Required_from_Json public Integer age;
   .
   .
 50 more values
}

如果Json中的其中一个丢失,它仍会创建对象但值为null。如果json中缺少某些值或者对象是" null"我需要引起一些异常(可能是NullPointException)。并且愚蠢地分别检查每个属性(如年龄!= null)

你们有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

这个问题与你的问题非常相似。它不是关于游戏,而是关于杰克逊:

https://jsfiddle.net/mrpf5ybq/

编辑:您可以自己创建简短的验证器:

for (Field f : obj.getClass().getFields()) {
  f.setAccessible(true);
  if (f.get(obj) == null) {
     // Throw error or return "bad request" or whatever
  }
}

此示例基于Configure Jackson to throw an exception when a field is missing

答案 1 :(得分:0)

由于您的JSON对象来自请求,您实际上可以使用Play的Form工具来处理您的情况。

在您的控制器方法中,您只需按以下方式调用它:

final Form<Example> form = Form.form(Example.class).bindFromRequest();

绑定请求中的数据。然后你可以检查是否有这样的错误:

    if(from.hasErrors()) {
        return badRequest(form.errorsAsJson());
    }

并在没有错误的情况下从表单中检索对象

    Example obj = form.get();

您的示例类还需要更改为使用Play的验证Contraints:

import play.data.validation.Constraints;
...

class Example{
  @Constraints.Required public String name;
  @Constraints.Required public boolean dead;
  @Constraints.Required public Integer age;
  .
  .
  50 more values
}

编辑:我应该注意,您的JSON对象属性名称和类属性变量名称必须相同才能使映射自动生效。

这种方式非常好,因为它返回的错误是特定于字段的,因此您可以将它们显示给用户,它将返回一个json对象(form.errorsAsJson())中所有字段的所有错误。您还可以使用Play提供的其他验证注释(例如@Contraints.Email@Constraints.MinLenth等)。

注意这对我在Play 2.3.x上有效。我没有使用任何最新版本的游戏,所以YMMV。