s****y 发帖数: 503 | 1 我用websphere v9beta(支持JAX-RS 2.0)实现restful,下面这段代码
@GET
@Path("/getJson1")
@Produces(MediaType.APPLICATION_JSON)
public JSONObject getJSON1() {
String input = "This is input";
String output = "This is output";
JSONObject outputJsonObj = new JSONObject();
outputJsonObj.put("input", input);
outputJsonObj.put("output", output);
return outputJsonObj;
}
如果用import com.ibm.json.java.JSONObject实现JsonObject是运行正常的,但是如
果用import org.json.JSONObject来实现就会报如下的错
[ERROR ] Problem with writing the data, class org.json.JSONObject,
ContentType: application/json
[WARNING ] Interceptor for HelloResource1 has thrown exception, unwinding
now
No serializer found for class org.json.JSONObject and no properties
discovered to create BeanSerializer (to avoid exception, disable
SerializationFeature.FAIL_ON_EMPTY_BEANS) )
按理说org.json跟通用啊?为什么websphere上运行会有这样的问题? |
d****i 发帖数: 4809 | 2 你没有理解这些annotation的真正用法,应该是返回一个Java object或者Response。
org.json.JSONObject已经是json了,不用像你这样包装成json。应该写成
@GET
@Path("/getJson1")
@Produces(MediaType.APPLICATION_JSON)
public MyObject getJSON1() {
MyObject obj = new MyObject();
obj.setInput("This is input");
obj.setOutput("This is output");
return obj
}
然后定义MyObject class:
public class MyObject {
private String input;
private String output;
// setters and getters
......
}
【在 s****y 的大作中提到】 : 我用websphere v9beta(支持JAX-RS 2.0)实现restful,下面这段代码 : @GET : @Path("/getJson1") : @Produces(MediaType.APPLICATION_JSON) : public JSONObject getJSON1() { : String input = "This is input"; : String output = "This is output"; : JSONObject outputJsonObj = new JSONObject(); : outputJsonObj.put("input", input); : outputJsonObj.put("output", output);
|
s****y 发帖数: 503 | 3
但是用IBM的包就没问题,而且如果要自己封装MyObject,我还不如直接用String了呢?
【在 d****i 的大作中提到】 : 你没有理解这些annotation的真正用法,应该是返回一个Java object或者Response。 : org.json.JSONObject已经是json了,不用像你这样包装成json。应该写成 : @GET : @Path("/getJson1") : @Produces(MediaType.APPLICATION_JSON) : public MyObject getJSON1() { : MyObject obj = new MyObject(); : obj.setInput("This is input"); : obj.setOutput("This is output"); : return obj
|
d****i 发帖数: 4809 | 4 JAX-RS里面不应该直接用JSON string来做序列化,而应该用POJO class, 这样JAX-RS
自动会把你的POJO class变成JSON, 你只需要告诉你的application用某个JSON
provider就可以了,比如你如果用Jackson,就只要在这个类中注册一下就可以了
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("foo.package").register(JacksonFeature.class);
}
}
呢?
【在 s****y 的大作中提到】 : : 但是用IBM的包就没问题,而且如果要自己封装MyObject,我还不如直接用String了呢?
|
g*****g 发帖数: 34805 | 5 Use @Provider annotation and register a Bean mapper there. that's the
standard practice.
RS
【在 d****i 的大作中提到】 : JAX-RS里面不应该直接用JSON string来做序列化,而应该用POJO class, 这样JAX-RS : 自动会把你的POJO class变成JSON, 你只需要告诉你的application用某个JSON : provider就可以了,比如你如果用Jackson,就只要在这个类中注册一下就可以了 : public class MyApplication extends ResourceConfig { : public MyApplication() { : packages("foo.package").register(JacksonFeature.class); : } : } : : 呢?
|