【问题标题】:JSONObject always returns "empty": falseJSONObject 总是返回 "empty": false
【发布时间】:2019-07-08 02:11:35
【问题描述】:

有一个 Spring Rest 控制器:

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

}

我用 Postman 做了一个测试:http://172.20.40.4:8080/Oxalys_WS/secanalytique/sectionbyaxepro/8;而我得到的总是

{
    "empty": false
}

那么有什么问题呢?

【问题讨论】:

  • 可以为 JSONObject 添加哪个库吗?是 org.json.simple.JSONObject 吗?
  • 它来自org.json.JSONObject;,依赖是:<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20180813</version> </dependency>
  • 我的输出为{"cce0":"frityyy"},带有simple.JSONObject
  • stackoverflow.com/questions/14941163/… 的可能重复项。我想你可以试试这个答案stackoverflow.com/a/14941402/6952155
  • 哦,知道了,当你添加 MediaType.APPLICATION_JSON_VALUE 时,它会将对象转换为 Json,但由于你已经有 json,它会尝试再次转换,如果你这样做 ResponseEntity.status(HttpStatus.OK).body(jsonModel.toString()) import org.springframework.http.ResponseEntity; 或只需return jsonModel.toString(); 就可以了

标签: java json spring rest


【解决方案1】:

我遇到了同样的问题,找到了处理方法。

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

【讨论】:

    【解决方案2】:

    您的实现存在一个问题,即您显式创建 JSON 对象并返回它,这不是必需的。
    相反,您应该只发送您的 java POJO/类,spring 会将其转换为 JSON 并返回它。
    Spring 使用 Jackson 作为默认的序列化器/反序列化器。
    这里由于一个对象已经是 JSONObject,Jackson 不知道如何序列化它。
    有两种方法可以解决这个问题

    1. 定义您自己的数据类型并填充它。

      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);
      }
      
    2. 将现有代码修改为以下任一方式。

      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

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

    【讨论】:

    • 非常感谢,我也遇到了类似的问题,尝试了上述方法,效果很好。
    【解决方案3】:

    您可以通过这种方式处理它,而不是手动创建 JSONObject

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

    【讨论】:

    • 它会自动把map转成json!
    【解决方案4】:

    org.json.simple 有效。对于不想将结果转换为字符串的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2016-07-20
      • 2021-11-05
      • 2018-11-05
      相关资源
      最近更新 更多