0

我正在使用 Jersey 和 Jackson 编写一个用于反序列化的宁静服务。我正在使用 Spring 进行依赖注入,我也在使用com.sun.jersey.spi.spring.container.servlet.SpringServlet(不使用 mvc)。我在客户端使用 RestyGWT。我正在从我的服务返回一组对象,我的客户抱怨它不是有效的 JSON 文档。这是服务返回的内容:

   {
    "0": {
        "type": "AQUISITION_DT",
        "value": "2013-2-1",
        "stats": {
            "total": 91,
            "used": 4
        }
    },
    "1": {
        "type": "AQUISITION_DT",
        "value": "2013-1-1",
        "stats": {
            "total": 24,
            "used": 13
        }
    }
}

我不确定,但我认为问题在于每个元素都由其索引包装。有没有办法可以指示 Jersey 或 Jackson 解开数组元素?如果我需要提供更多信息,请告诉我。

在代码中,我将结果作为 JSONWithPadding 对象发送回来,如下所示:return new JSONWithPadding(array, callback);

顺便说一句,我已经在我的球衣中配置web.xml了使用 POJO 映射:

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

更新 我从终端用 curl 进行了测试,返回的字符串看起来正确(我已经删除了回调外壳):

 {
    {
        "type": "AQUISITION_DT",
        "value": "2013-2-1",
        "stats": {
            "total": 91,
            "used": 4
        }
    },
    {
        "type": "AQUISITION_DT",
        "value": "2013-1-1",
        "stats": {
            "total": 24,
            "used": 13
        }
    }
}

我最初发布的字符串正在由 restyGWT 报告。很抱歉这个令人困惑的帖子,我不确定为什么 restyGwt 抱怨......

谢谢!

4

2 回答 2

0

如果要返回一个对象数组,json 格式应该如下所示

[
   {
      "type":"AQUISITION_DT",
      "value":"2013-2-1",
      "stats":{
         "total":91,
         "used":4
      }
   },
   {
      "type":"AQUISITION_DT",
      "value":"2013-1-1",
      "stats":{
         "total":24,
         "used":13
      }
   }
]

您可以轻松地在资源方法中返回一个数组,如下所示

@Path("/test")
@GET        
@Produces(MediaType.APPLICATION_JSON)
public Test[] haha(){
    Test[] arr = new Test[3]; 
    arr[0] = new Test();
    arr[1] = new Test();
    arr[2] = new Test();
    return arr;
}

测试类如下

public class Test {
    public String type="AQUISITION_DT"; 
    public String value = "2013-2-1";
    public Stats stats = new Stats();
}

public class Stats {
    public int total = 10;
    public int used = 13;
}
于 2013-05-06T03:09:14.193 回答
0

我能够解决这个问题的唯一方法是将结果包装在一个对象中。最初我返回一个数组 ( MyObject[])。现在我回来了MyObjectListing:

public class MyObjectListing {
   MyObject[] objects;
   ...
   //getters/setters, etc.
}

返回 MyObjectListing 解决了问题......我不明白为什么。

于 2013-05-11T17:06:16.353 回答