【问题标题】:How to retrieve JSON passed from ajax call to Java API如何检索从 ajax 调用传递到 Java API 的 JSON
【发布时间】:2016-11-14 04:57:58
【问题描述】:

我正在按如下方式调用 JAVA API:

var userDetails = {
            userId: userId,
            first : "1 one",
            second : "2 two"
        }
    $.ajax({
        type : 'POST',
        url : "http://" + config.domain + config.root + "/myExp/allExperiment",
        dataType : "json",
        data : userDetails, 
        success : function(data) {})
   });

并尝试按如下方式获取传递的对象:

@RequestMapping(value = "/allExperiment", method = RequestMethod.POST)
    public JsonMapModel getAllDatasets(@RequestBody String userDetails) {
         System.out.println("Data is " + userDetails);
}

我在 API 上获得了关注 数据是 second=2+two&userId=16&first=1+one

知道如何将上述响应转换为 JSONObject 或任何其他集合,以便我可以适当地引用传递的 JSON。

【问题讨论】:

  • 你在 Java 端使用什么库来处理请求?
  • 目前没有使用任何库,它只是一个基于 Spring 的 API,想知道我应该使用/做什么来解析请求体

标签: java json ajax api


【解决方案1】:

您使用杰克逊库。 Jackson 将 Java 对象与 JSON 相互转换

(pom.xml)

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>

(js)

    var userDetails = {
            userId: userId,
            first : "1 one",
            second : "2 two"
        }

    userDetails = JSON.stringify(userDetails);       

    $.ajax({
        type : 'POST',
        url : "http://" + config.domain + config.root + "/myExp/allExperiment",
        contentType : 'application/json',
        data : userDetails,

        success : function(data) {

    },
    error : function(request, status, error) {

    }
});

(型号)

public class TestModel {

    private String userId;
    private String first;
    private String second;

    //getter, setter 
}

(控制器)

@RequestMapping(value = "/allExperiment", method = RequestMethod.POST)
public @ResponseBody String getAllDatasets(@RequestBody TestModel userDetails) {


    return null; // break point, check model.
}

【讨论】:

  • 与其包含多个杰克逊库,我认为google-gson 足以胜任这项工作。另外我认为在ajax调用中应该是data : JSON.stringify(userDetails)
  • 哦。孙好。我想你的评论很好。好的。编辑。谢谢!
【解决方案2】:

您可以使用 Jersey API 在服务器端将 JSON 转换为值对象。 Jersey Jar 自动将 JSON 转换为 VO 和 VO 到 JSON。 下面是如何在服务器端接收 VO 的快照:

@POST
@Path("/allExperiment")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public JsonMapModel  getAllDatasets(UserDetails userDetails) {
     System.out.println("Data is " + userDetails);
}

【讨论】:

    【解决方案3】:

    根据@Alexandru Marina 的建议,感谢您的回复,以下对我有用:

    @RequestMapping(value = "/allExperiment", method = RequestMethod.POST)
        public JsonMapModel getAllDatasets(@RequestBody MultiValueMap<String, String> userDetails) {
    System.out.println("User id is "  userDetails.getFirst("userId")); }
    

    再次感谢

    【讨论】:

      【解决方案4】:

      如果您将 String userDetails 替换为真实对象(例如 UserDetails userDetails),它应该可以工作。

      或者尝试使用 MultiValueMap 而不是 String。从下面的链接看来,如果这是参数,那么 Spring 会自动使用 FormHttpMessageConverter。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestbody

      【讨论】:

      • 是的,可以这样做,但是我想要一种机制,无论 JSON 中的参数数量如何,我都可以维护服务器端对象,例如,如果传递的 JSON 有 2 个键值对,或者它可以是 5 个键值对,应该存储在服务器的通用集合对象中
      • 尝试使用 MultiValueMap 而不是 String。从下面的链接看来,如果这是参数,那么 Spring 会自动使用 FormHttpMessageConverter。 docs.spring.io/spring/docs/current/spring-framework-reference/…
      • 是的,它通过使用 MultiValueMap 对我有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 2020-06-09
      相关资源
      最近更新 更多