wake-up-neo.com

Erstellen und Verwenden von benutzerdefinierten JSON-Objekten in Spring-RESTful-Services

Ich habe einige JSON-Objekte, die komplexer sind als die JSON-Darstellungen der Java-Objekte, die ich habe. Ich habe Methoden, die diese JSON-Objekte erstellen, und ich möchte diese direkt zurückgeben und konsumieren. Ich verwende org.json library, um meine JSONs zu erstellen. Ich könnte die GET-Methode zum Laufen bringen, indem ich das JSON-Objekt als String zurücksende. Ist dies der richtige Weg, um das zu erreichen?

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

Jetzt möchte ich wissen, wie ich ein JSON-Objekt konsumiere? Als String und konvertiere es in ein JSON-Objekt?

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

Ist dies der richtige Weg, um mein Problem zu lösen? Ich bin ein Novize, ich möchte Sie auf alles aufmerksam machen, was besser gemacht werden kann. Bitte beachten Sie: Ich möchte keine POJOs zurücksenden.

16
user592748

Ich denke, mit der Jackson-Bibliothek kann man so etwas tun.

@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

Ich bin eher die Alternative, um Jackson mit Spring MVC zu verwenden, da Sie sich nicht um die Serialisierung und Deserialisierung Ihrer Objekte/Json-Json/Objekt sorgen müssen. Aber wenn Sie den Prozess trotzdem wollen, benutze ich gerne Gson von Google.

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

1
paul

Sie können jackson lib verwenden, jackson ermöglicht die Konvertierung von/nach Json mit Spring MVC.

  1. Frühling konfigurieren @ResponseBody JSON-Format
  2. Jackson 2.0 mit Spring 3.1
1
kemenov

Ich konnte die automatische Serialisierung und Deserialisierung nicht mit den standardmäßigen Spring-Boot-Beans erreichen. Am Ende funktionierte das gut für mich, nachdem ich Project Lombok und Apache BeanUtils dabei hatte. Spring ruft einen String arg -Konstruktor auf, wenn die Serialisierung nicht automatisch durchgeführt werden kann.

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