2016-08-18 71 views
0

我正在使用Play Framework 2.5(Java)和表单数据绑定(来自Spring Framework)开发REST webservice。 我对这个API非常有经验,并且喜欢它将形式化验证约束(例如Required)的方式,所以我想避免使用BodyParser API。Play Framework JSON表单的类型选择

我需要解析JSON请求像这样:

{ 
    "elements": [ 
     { 
      "val": "1" 
     }, 
     { 
      "val": ["1","2","3"] 
     } 
    ] 
} 

的问题是“VAL”接受两种不同的类型:字符串(java.lang.String中在Java中)和一个字符串数组(在我的代码中的java.util.List)。

我该如何在我的Java代码中“类型化”这种JSON格式的模型? 我已经试着用“val”属性为不同类型的两个不同子类实现的抽象(和通用)类,但是Spring无法实例化对象(BeanInstantiationException)。

这是当前的数据模型:

public class Foo { 

    @Constraints.Required 
    public List<Fii> elements; 

} 

public class Fii { 

    @Constraints.Required 
    // Which type ? Object ? 
    public ? val; 

} 

回答

3
public class Response 
{ 
    List<ResponseEntry> response; 
    /*getters + setters */ 

    public static class ResponseEntry 
    { 
     private List<Value> elements; 
     /*setters + getters*/ 

     public static class Value 
     { 
      private List<Object> val; 
     } 
    } 
} 

不幸的是,你正在处理JSON的结构,只有这样,才能反序列化是有属性的值是Object类型。但是,一旦JSON被反序列化,您就可以轻松确定值是一个对象还是一个值。

请注意,JSON只支持五种数据类型:对象(Map in java),数组,字符串,数字和布尔值。它看起来像你的情况,价值很可能是一个数字或一个数字地图;那么你有两种可能性来检查。使用一个快速的比较实例,你应该能够弄清楚它是什么类型的值。

ObjectMapper mapper = new ObjectMapper(); 
Response r = mapper.readValues(json, Response.class); 
Value val = r.response.get(0).values.get(0); 
if (val.value instanceof Map) 
    ; // multiple 
else 
    ; // single 
+0

谢谢:)。我不确定Java对象类型是否会自行适应JSON结构,因为我认为数据映射器只查看Java类型。我确实可以通过instanceof测试将每个Value类转换为特定的类。 –

+0

@Alexandre LEBRUN很高兴听到我的回答帮助你! –