从数据库中检索 JSON 正文会提供额外的特殊字符 - Spring 引导

Retrieving a JSON body from DB gives extra special characters - Spring Boot

我们正在我们的 Oracle 数据库中保存一个 JSON 响应主体,稍后为了查看目的检索它。

这是JSON保存在DB

{"parameters": [{"name": "SEATS", "value": "Q1"}, {"name": "SEATS", "value": "Q2"}, {"name": "MEMBERS", "value": "Alen"}, {"name": "MEMBERS", "value": "Sara"}], "messageTemplate": "You have booked tickets, seat numbers are Q1,Q2", "url": "", "remarks": "ticket booked"}

现在我们视图的响应API是这样的-(多了一个斜杠)

{
    "responseBody": "{\"parameters\": [{\"name\": \"SEATS\", \"value\": \"Q1\"}, {\"name\": \"SEATS\", \"value\": \"Q2\"}, {\"name\": \"MEMBERS\", \"value\": \"Alen\"}, {\"name\": \"MEMBERS\", \"value\": \"Sara\"}], \"messageTemplate\": \"You have booked tickets, seat numbers are Q1,Q2\", \"url\": \"\", \"remarks\": \"ticket booked\"}"
}

调试时查看变量值

{"parameters": [{"name": "SEATS", "value": "Q1"}, {"name": "SEATS", "value": "Q2"}, {"name": "MEMBERS", "value": "Alen"}, {"name": "MEMBERS", "value": "Sara"}], "messageTemplate": "You have booked tickets, seat numbers are Q1,Q2", "url": "", "remarks": "ticket booked"}

数据库端

列说明:VARCHAR2(500)

有关 JSONObject

用法的更新

我试过这样打印 System.out.println(new JSONObject(responseBody));。控制台正在打印正确的 JSON 正文,但即使我使用与上述相同的逻辑,仍然有特殊字符。

Spring引导部分 控制器

@RestController
@RequestMapping("v1/booking")
public class BookingReportsController {
    
    @Autowired
    private BookingReportsService service;
    
    @GetMapping(value = "/more-info/{tnxId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public Booking moreInfo(@PathVariable(name = "tnxId") String tnxId) {
        
        return service.moreInfo(tnxId);
    }
}

我们尝试返回 BookingResponseEntity<Booking>,但结果是一样的。

这是我们的响应 bean

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Booking implements Serializable {

    private static final long serialVersionUID = 7480161196626214557L;

    private String txnId;
    
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern =Constants.SETTLEMENT_PDF_DATE_FORMAT)
    private Date txnDate;
    
    private String userId;
    
    private String appId;
    
    private String appName;

    private double amount;
    
    private int status;
    
    private String responseBody;
    
    private String url;

    // getters and setters
}

我们得到一个额外的 \ 作为转义字符,现在如果我们美化 JSON 并将其放在多行中,我们将在响应中得到 \r & \n .那么我们怎样才能删除它呢?

你可以做到这一点

String final_json= json.replaceAll("\\","");

json 是包含您的 json
的字符串 我做了四个 \ 因为如果我输入一个它会期望像 \n\r

TL;DR
刚刚用@JsonRawValue注解了private String responseBody;如下:

@JsonRawValue
private String responseBody;

说明
因为 responseBody 的值是一个 JSON 字符串,而 @RestController 将把 moreInfo 的 return 对象序列化为 HttpResponse 自动。这就是为什么您的响应正文中有“额外的特殊字符”!

因此,最简单的方法(使用Jackson)是将那些您不想再次序列化的字段注释为@JsonRawValue

更多信息请参考@JsonRawValue