6
votes

JSONObject renvoie toujours "vide": false

Il existe un contrôleur Spring Rest:

{
    "empty": false
}

J'ai fait un test avec Postman: http://172.20.40.4:8080/Oxalys_WS/secanalytique/sectionbyaxepro/8 ; et ce que j'ai toujours, c'est

@RestController
@RequestMapping("secanalytique")
public class SectionAnalytiqueController {

    @GetMapping(value = "/sectionbyaxepro/{codecomp}", produces = "application/json")
    public JSONObject getByAxePro(@PathVariable String codecomp) {
        JSONObject jsonModel = new JSONObject();
        jsonModel.put("cce0","frityyy");
        return jsonModel;
    }

}

Alors qu'est-ce qui ne va pas?


6 commentaires

pouvez-vous ajouter quelle bibliothèque pour JSONObject? est-ce org.json.simple.JSONObject?


il provient de org.json.JSONObject; , la dépendance est: org.json json 20180813


Je reçois une sortie sous la forme {"cce0": "frityyy"} , avec simple.JSONObject


Double possible de l ' stackoverflow.com/ questions / 14941163 /… . Je pense que vous pouvez essayer cette réponse stackoverflow.com/a/14941402/6952155


Ohh, compris, lorsque vous ajoutez MediaType.APPLICATION_JSON_VALUE , il convertit l'objet en Json, mais puisque vous avez déjà json, qu'il tente de convertir à nouveau, si vous faites ResponseEntity.status (HttpStatus .OK) .body (jsonModel.toString‌ ()) import org.springframework.http.ResponseEntity; ou simplement renvoyer jsonModel.toString (); it travaux


Je suggérerais de définir votre propre type de données et vous ne devriez pas vous soucier de la conversion json, cela sera pris en charge par Spring.


4 Réponses :


0
votes

Au lieu de créer JSONObject manuellement, vous pouvez le gérer de cette manière

@GetMapping(value = "/sectionbyaxepro/{codecomp}")
    public ResponseEntity<?> getByAxePro(@PathVariable("codecomp") String codecomp){
        Map map = new HashMap<>();
        map.put("key", "value");
        return new ResponseEntity<>(map, HttpStatus.OK);
    }


1 commentaires

Il convertira automatiquement la carte en json!



2
votes

Il y a eu un problème avec votre implémentation: vous créez un objet json explicitement et que vous le renvoyez ce qui n'est pas obligatoire.
Au lieu de cela, vous devez simplement envoyer votre java POJO / class, spring le convertira en JSON et le renverra.
Spring utilise Jackson comme sérialiseur / désérialiseur par défaut. Ici, puisqu'un objet est déjà JSONObject, Jackson ne sait pas comment le sérialiser.
Il existe deux façons de résoudre ce problème
1. Définissez votre propre type de données et remplissez-le.

@GetMapping(value = "/sectionbyaxepro/{codecomp}", produces = MediaType.APPLICATION_JSON_VALUE)
public String getByAxePro(@PathVariable String codecomp) {
JSONObject jsonModel = new JSONObject();
jsonModel.put("cce0","frityyy");
return jsonModel.toString();
}
  1. Modifiez votre code existant de l'une des manières suivantes.

1

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;

@GetMapping(value = "/sectionbyaxepro/{codecomp}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<String> getByAxePro(@PathVariable String codecomp) {
    JSONObject jsonModel = new JSONObject();
    jsonModel.put("cce0","frityyy");
    return ResponseEntity.status(HttpStatus.OK).body(jsonModel.toString());
}

2

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;

@GetMapping(value = "/sectionbyaxepro/{codecomp}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, String>> getByAxePro(@PathVariable String codecomp) {
    Map<String, String> map = new HashMap<>();
    map.put("cce0","frityyy");
    return ResponseEntity.status(HttpStatus.OK).body(map);
}


1 commentaires

Merci beaucoup, j'étais également confronté à un problème similaire, j'ai essayé l'approche ci-dessus et cela fonctionne bien.



4
votes

J'ai rencontré le même problème et j'ai trouvé le moyen de le gérer.

@GetMapping(value = "/test/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getById(@PathVariable String id) {
    JSONObject jsObj = new JSONObject();
    jsObj.put("t0","test0");
    JSONArray jsArr = new JSONArray();
    jsArr.put(jsObj.toMap());

    return new ResponseEntity<>(jsObj.toMap(), HttpStatus.OK);
    //return new ResponseEntity<>(jsArr.toList(), HttpStatus.OK);
}


0 commentaires

0
votes

org.json.simple fonctionne. Pour quelqu'un qui ne souhaite pas convertir le résultat en String.


0 commentaires