web-dev-qa-db-fra.com

Production et consommation d'objets JSON personnalisés dans les services RESTful de Spring

Certains objets JSON sont plus complexes que les représentations JSON des objets Java que j'ai. J'ai des méthodes qui construisent ces objets JSON et je voudrais les retourner et les consommer directement. J'utilise la bibliothèque org.json pour créer mes fichiers JSON. Je pouvais faire fonctionner la méthode GET en renvoyant l'objet JSON en tant que String. Est-ce la bonne façon de s'y prendre?

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

Maintenant, je veux savoir comment je consomme un objet JSON? En tant que chaîne et le convertir en objet 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();
    }

Est-ce la bonne façon de régler mon problème? Je suis un novice, alors signalez gentiment tout ce qui peut être amélioré. Remarque: je ne souhaite pas retourner les POJO.

16
user592748

Je pense qu'en utilisant la bibliothèque Jackson, vous pouvez faire quelque chose comme ci-dessous.

@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

J'ai plutôt une alternative à utiliser Jackson avec Spring mvc puisque vous n'avez pas à vous soucier de la sérialisation et de la désérialisation de vos objets/json-json/objet. Mais si vous voulez toujours le processus, j'aime utiliser gson de google.

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

1
paul

Vous pouvez utiliser jackson lib, jackson permet de convertir vers/depuis json en utilisant spring mvc.

  1. Spring configure le format JSON @ResponseBody
  2. Jackson 2.0 avec Spring 3.1
1
kemenov

Je n'arrivais pas à faire fonctionner la sérialisation automatique et la désérialisation à l'aide des beans de démarrage Spring par défaut. En fin de compte, cela a bien fonctionné pour moi après avoir inclus le projet Lombok et Apache BeanUtils. Spring appelle un constructeur String arg s'il ne peut pas effectuer automatiquement la sérialisation.

@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/