通过play.data.Form将JSON转换为JAVA对象
我不知道该怎么处理这个问题。 我有一个JSON对象来帮助通过POST(使用Play Framework)输入值,其结构如下:通过play.data.Form将JSON转换为JAVA对象,java,json,spring,playframework,Java,Json,Spring,Playframework,我不知道该怎么处理这个问题。 我有一个JSON对象来帮助通过POST(使用Play Framework)输入值,其结构如下: { "start_absolute": 1403185486254, "end_absolute": 1403185486254, "metrics": [ { "name": "parts", "tags": [ {
{
"start_absolute": 1403185486254,
"end_absolute": 1403185486254,
"metrics": [
{
"name": "parts",
"tags": [
{
"key":"machine",
"value":"10"
}
],
"sampling":
{
"value": 1,
"unit": "minutes"
}
}
]
}
Form<QueryForm> queryForm = Form.form(QueryForm.class).bindFromRequest();
if (queryForm.hasErrors()) {
return badRequest(queryForm.errorsAsJson());
}
QueryForm queryInfo = queryForm.get();
在服务器端,我尝试如下处理信息:
{
"start_absolute": 1403185486254,
"end_absolute": 1403185486254,
"metrics": [
{
"name": "parts",
"tags": [
{
"key":"machine",
"value":"10"
}
],
"sampling":
{
"value": 1,
"unit": "minutes"
}
}
]
}
Form<QueryForm> queryForm = Form.form(QueryForm.class).bindFromRequest();
if (queryForm.hasErrors()) {
return badRequest(queryForm.errorsAsJson());
}
QueryForm queryInfo = queryForm.get();
我没有使用play.data.Form的经验,但在以前使用更简单对象(使用基本数据类型和字符串)的ocation中,这很好,但当我尝试发布到play应用程序(Header:Content-Type=application/json;charset=utf-8)时,出现了一个内部服务器错误:
play.api.Application$$anon$1: Execution exception [[InvalidPropertyException:
Invalid property 'metrics[0].tags[0]' of bean class [model.QueryForm]: Illegal
attempt to get property 'tags' threw exception; nested exception is
org.springframework.beans.NullValueInNestedPathException: Invalid property
'metrics[0].tags' of bean class [model.QueryForm]: Could not instatiate property
path:
java.lang:InstatiationException: [model.Tag]
有人能帮忙吗?我不知道该怎么办。从JSON转换对象是复杂的吗?我是否需要添加一些JSON注释(当前未使用)
我不知道如何解决这个问题
更新:我把它缩小到标签类。由于某些原因,我无法通过JSON稳定标记。我甚至尝试过将单个标记实例设置为与日期相同的级别,但它给出了相同的错误(它适用于采样) 决议: 答案在上面的帖子里。我必须在Tag类中设置一个空构造函数,它才能工作
public Tag(){
}
异常意味着一个或多个属性没有实例化
private List<MetricForm> metrics = new ...;
private List<Tag> tags = new ...;
private RelativeTimeForm sampling = new ...;
private List metrics=new。。。;
私有列表标签=新。。。;
私有相对论形式抽样=新。。。;
我应该这样做
如果您在读取时间值时遇到问题:我将使用
long
读取时间值,然后(内部)将它们转换为Date
对象,而不是直接使用Date
类型来读取时间值 使用GSON将JSON转换为java对象您看到了吗?是的,但我没有在对象中的对象列表中找到作为对象的示例(我把它缩小到标记类。出于某种原因,我无法通过JSON稳定标记。我甚至尝试将单个标记实例设置为与日期相同的级别,它给出了与您告诉我的相同的错误,但错误是相同的。我用完整的类更新了帖子。注意:日期对象捕捉得很好,但我有那一个。
public Tag(){
}
private List<MetricForm> metrics = new ...;
private List<Tag> tags = new ...;
private RelativeTimeForm sampling = new ...;