从数据库中检索 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);
}
}
我们尝试返回 Booking
和 ResponseEntity<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。
我们正在我们的 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);
}
}
我们尝试返回 Booking
和 ResponseEntity<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。