【问题标题】:Unable to Convert String into JSON using Java无法使用 Java 将字符串转换为 JSON
【发布时间】:2019-04-19 17:31:23
【问题描述】:

我从 rest 调用中得到一个 json 为 {"d1":1, "d2":1, "d3":0, "d4":1} 存储在 db 中 - {d1=1, d2 =1,d3=0,d4=1}。

当我从数据库中读取数据时,我将上述字符串作为 - {d1=1, d2=1, d3=0, d4=1}。我想像以前一样将其转换为原始形式 - {"d1":1, "d2":1, "d3":0, "d4":1} 上面提到的。

我如何在 java 中实现这一点。是否有任何可用的 json 库来执行此操作?

到目前为止,我已经尝试过,但没有成功 -

JSONParser 解析器 = 新 JSONParser(); JSONObject json = (JSONObject) parser.parse(jsonString);

我想把这个json放到ResponseEntity中>。

即使我尝试过 -

jsonString = jsonString.replaceAll("=", ":"); JSONObject jsonObject = new JSONObject(jsonString);

String finalJsonString = jsonObject.toString();

这是返回响应为 "{\"d1\":1, \"d2\":1, \"d3\":0, \"d4\":1}" 开头带有双引号并在键的双引号之前以反斜杠结尾。

【问题讨论】:

  • 您存储在 db 中的字符串不是 JSON。所以很自然,将其解析为 JSON 是行不通的。
  • jsonlint.com你需要检查你的json,
  • 存储在数据库中的字符串看起来像AbstractMap.toString()的结果。寻找一种方法来解析它。

标签: java spring-boot


【解决方案1】:

通过DB返回的String不是JSON格式,所以解析失败。

您可以使用以下方法将返回的字符串格式化为 JSON 字符串,然后对其进行解析。 我用过GuavaSplitter.MapSplitter

        String in = "{d1=1,d2=1,d3=0,d4=1}";
        in = in.replaceAll("[{}]", "");
        Map<String, String> properties = Splitter.on(",").withKeyValueSeparator("=").split(in);
        JSONObject obj = new JSONObject(properties);
        String formattedString = obj.toString();

【讨论】:

    【解决方案2】:

    您从 DB 中检索的字符串是一个 Map 数据结构。因此,您可以将 Map 转换为 JSON,如下所示:

    Map<String,String> payload = new HashMap<>();
    payload.put("key1","value1");
    payload.put("key2","value2");
    
    String json = new ObjectMapper().writeValueAsString(payload);
    System.out.println(json);
    

    已编辑

    以下代码 sn-p 将为您提供完整的 JSON 响应。

    @RestController
    @RequestMapping("/api/v1/")
    public class TestController {
    
    @GetMapping(value="test",produces=MediaType.APPLICATION_JSON_VALUE) 
        public ResponseEntity<String> test() {
    
            Map<String,String> payload = new HashMap<>();
            payload.put("d1","value1");
            payload.put("d2","value2");
            payload.put("d3","value3");
            payload.put("d4","value4");
            String json =null;
            try {
                 json= new ObjectMapper().writeValueAsString(payload);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }       
            return new ResponseEntity(json,HttpStatus.OK);
        }
    }
    

    邮递员测试:

    【讨论】:

    • 我不希望这个在字符串中,我需要输出 - {"d1":1, "d2":1, "d3":0, "d4":1} no第一个和最后一个字符串
    【解决方案3】:

    你可以这样做:

    ObjectMapper mapper = new ObjectMapper();
                try {
                    MyResponse result = mapper.readValue(e.getResponseBodyAsString(),MyResponse.class);
                    return result;
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多