it-roy-ru.com

Создание и использование пользовательских объектов JSON в сервисах Spring RESTful

У меня есть несколько JSON-объектов, которые являются более сложными, чем JSON-представления Java-объектов, которые у меня есть. У меня есть методы, которые создают эти объекты JSON, и я хотел бы вернуть и использовать их напрямую. Я использую библиотеку org.json для создания моих JSON. Я мог бы заставить метод GET работать, возвращая объект JSON как 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.

16
user592748

Я думаю, что с помощью библиотеки Джексона вы можете сделать что-то вроде ниже.

@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);
}
20
RE350

Я предпочитаю альтернативу использовать Джексона с Spring mvc, так как вам не нужно беспокоиться о сериализации и десериализации ваших объектов/json-json/object. Но если вы все еще хотите, чтобы процесс, я хотел бы использовать gson от Google.

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

1
paul

Вы можете использовать Джексон Либ, Джексон позволяет конвертировать в/из JSON с помощью Spring MVC.

  1. Spring настраивает формат @ResponseBody JSON
  2. Джексон 2.0 с пружиной 3.1
1
kemenov

Я не смог заставить работать автоматическую сериализацию и десериализацию с использованием загрузочных бинов Spring по умолчанию. В конце концов, у меня все получилось после включения Project Lombok и Apache BeanUtils. Spring вызывает конструктор аргумента String, если он не может автоматически выполнить сериализацию.

@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.cgihttps://projectlombok.org/

0
Hypothetical inthe Clavicle