如何将JSON映射到Java对象

时间:2015-08-17 07:51:06

标签: java json

在我的网络服务中,我在邮件请求中向服务器发送了一个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"])

2 个答案:

答案 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
}

必须阅读JacksonInFiveMinutes

以下图片来自http://json.org/

enter image description here

enter image description here

答案 1 :(得分:1)

JSON.stringify应该适用于您的用例。你还没有提到你面临的确切问题是什么,但你的json似乎是不正确的(与你试图将它映射到的对象相比)。

您的域对象名为IdsRequest,您的服务使用User,您的json名称包含名称和限制。在你的json中,根元素是“names”,它有一个名字数组,这不是你的域对象User的样子。因此,在映射两者时会出现错误。