在我的网络服务中,我在邮件请求中向服务器发送了一个json。在服务器中,我需要将此信息放入我的被调用函数的Argument中。
这是我在服务器端的功能:
@Path("/myapp/myfunction/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SiderRecommender {
@POST
@Path("recs")
public Response getRecommendations(User usr) {
// Here I want to access request payload inside
//usr object. For example :
// System.out.println("limit sending by client:"+usr.getLimit());
// System.out.println("size of List sent by client:"+usr.getNames().size());
}
}
这是我的用户类:
@XmlRootElement
public class User {
private List<String> names;
private int limit;
public List<String> getNames() {
return names;
}
public void setNames(List<String> names) {
this.names = names;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
最后,这是我在客户端发送请求的方式:
var url = 'http://localhost:8080/myapp/myfunction/recs';
var xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.onload = function() {
var text = xhr.responseText;
var title = getTitle(text);
alert('Response from CORS request to ' + url + ': ' + title);
};
xhr.onerror = function() {
alert('Woops, there was an error making the request.');
};
xhr.send(JSON.stringify({"names":[{"names":"SampleName1"}, {"names":"SampleName2"},{"names":"SampleName3"}],"limit":100 }));
我认为,我可能在JSON.stringify()中使用了语法。它看起来是对的吗?
编辑我顺便使用JACKSON。
EDIT2
在浏览器中,我收到此错误:
Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@6508327b; line: 1, column: 10] (through reference chain: com.mypackage.User["names"])
答案 0 :(得分:5)
问题在于您从JavaScript传递的JSON对象。
{
"names": [
{
"names": "SampleName1"
},
{
"names": "SampleName2"
},
{
"names": "SampleName3"
}
],
"limit": 100
}
“名称”下的“名称”将映射到Java对象中的List<Map<String,String>>
。
更改Java对象或更改JSON对象,如下所示,将其映射到List<String>
{
"names": [
"SampleName1",
"SampleName2",
"SampleName3"
],
"limit": 100
}
以下图片来自http://json.org/
答案 1 :(得分:1)
JSON.stringify应该适用于您的用例。你还没有提到你面临的确切问题是什么,但你的json似乎是不正确的(与你试图将它映射到的对象相比)。
您的域对象名为IdsRequest,您的服务使用User,您的json名称包含名称和限制。在你的json中,根元素是“names”,它有一个名字数组,这不是你的域对象User的样子。因此,在映射两者时会出现错误。