在Spring RESTful服务中生成和使用自定义JSON对象

时间:2014-09-30 07:26:55

标签: java json spring rest post

我有一些JSON对象比我拥有的java对象的JSON表示更复杂。我有构建这些JSON对象的方法,我想直接返回并使用它们。我使用org.json库来构建我的JSON。我可以通过将JSON对象作为GET返回来获得String方法。这是正确的方法吗?

@RequestMapping(value = "/getjson", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public String getJson() {
    JSONObject json = new JSONObject();
     JSONObject subJson = new JSONObject();
    subJson .put("key", "value");
    json.put("key", subJson);
    return json.toString();
}

现在我想知道如何使用JSON对象?作为字符串并将其转换为JSON对象?

    @RequestMapping(value = "/post", method = RequestMethod.POST, produces="application/json", consumes="application/json")
    @ResponseBody
    public String post(@RequestBody String json) {
        JSONObject obj = new JSONObject(json);
        //do some things with json, put some header information in json
        return obj.toString();
    }

这是解决我问题的正确方法吗?我是一个新手,所以请指出任何可以做得更好的事情。请注意:我不想退回POJO。

4 个答案:

答案 0 :(得分:21)

我认为使用jackson库你可以做类似下面的事情。

@RequestMapping(value = "/getjson", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public String getJson() {
   //your logic
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(json);
}

@RequestMapping(value = "/post", method = RequestMethod.POST, produces="application/json", consumes="application/json")
@ResponseBody
public String post(@RequestBody String json) {
    POJO pj = new POJO();
    ObjectMapper mapper = new ObjectMapper();
    pj = mapper.readValue(json, POJO.class);

    //do some things with json, put some header information in json
    return mapper.writeValueAsString(pj);
}

答案 1 :(得分:1)

你可以使用jackson lib,jackson允许使用spring mvc转换为/来自json。

  1. Spring configure @ResponseBody JSON format
  2. Jackson 2.0 with Spring 3.1

答案 2 :(得分:1)

我非常宁愿使用Jackson和Spring mvc,因为你不必担心你的对象/ json-json / object的序列化和反序列化。但如果你仍然想要这个过程我喜欢使用google的gson。

http://www.javacreed.com/simple-gson-example/

答案 3 :(得分:0)

我无法使用默认的Spring boot bean来进行自动序列化和反序列化。最后,在加入Project Lombok和apache BeanUtils之后,对我来说效果很好。如果无法自动进行序列化,Spring会调用String arg构造函数。

@PostMapping("/create")
@ResponseBody
public User createUser(HttpServletRequest request, @RequestParam("user") User u) throws IOException {

    LOG.info("Got user! " + u);

    return u;
}


@ToString() @Getter() @Setter() @NoArgsConstructor()
public class User {
    private String email;
    private String bio;
    private String image;
    private String displayName;
    private String userId;
    private long lat;
    private long lng;

    public User(String json) throws JsonParseException, JsonMappingException, IOException, IllegalAccessException, InvocationTargetException {
        ObjectMapper om = new ObjectMapper();
        User u = om.readValue(json, User.class);
        BeanUtils.copyProperties(this, u);
    }
}

http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi https://projectlombok.org/