我有一个getStatus RESTful服务(使用swagger实现),它接受一个ID并返回一个JSON对象,其中包含一些由服务组装的头信息以及来自Oracle DB中多个表的JSON(存储为带有JSON约束的CLOB)。
我包含这些信息是因为服务组装的JSON显示正确,但是来自DB的所有数据都不会显示给消费者,尽管它会显示在日志中。然而,并非所有丢失的数据都以JSON的形式存储在数据库中。例如,corCount和errorCount以与failedCorrs相同的方式从DB中取出并组装,但failedCorrs缺失。
*验证码:
app.MapGet("/status/batchId={batchId}", (decimal batchId) => getStatus(batchId));
个字符
*输出到消费者:
{
"batchId": 51286,
"appName": "CoGSTestApp",
"corrCount": 3,
"errorCount": 0,
"requests": [
{
"requestId": "requestId1",
"corrCount": 3,
"errorCount": 0,
"failedCorrs": [
]
}
],
"docsGenerated": [
{
"outputChannelName": [
],
"nextRunTime": [
],
"fileCounts": [
[
[
[
]
],
[
[
]
]
]
]
},
{
"outputChannelName": [
],
"nextRunTime": [
],
"fileCounts": [
[
[
[
]
],
[
[
]
]
]
]
}
]
}
型
*Console.WriteLine:
{
"batchId": 51286,
"appName": "CoGSTestApp",
"corrCount": 3,
"errorCount": 0,
"requests": [
{
"requestId": "requestId1",
"corrCount": 3,
"errorCount": 0,
"failedCorrs": []
}
],
"docsGenerated": [
{
"outputChannelName": "CoGSTestPrint",
"nextRunTime": "Output Channel is OnDemand, running immediately.",
"fileCounts": [
{
"fileType": "PS",
"fileCount": 0
}
]
},
{
"outputChannelName": "CoGSTestFileShare",
"nextRunTime": "Output Channel is OnDemand, running immediately.",
"fileCounts": [
{
"fileType": "PDF",
"fileCount": 3
}
]
}
]
}
型
1条答案
按热度按时间smdnsysy1#
您所面临的问题似乎与向消费者返回响应时JSON数据的序列化有关。数据在打印到控制台时显示正确,但在消费者接收时显示错误。
这种行为最可能的原因是,在响应生成过程中,Oracle DB中的一些数据(存储为带有JSON约束的CLOB)没有被正确地序列化。要解决此问题,可以在将CLOB中的JSON数据添加到
statusObj
之前显式地将其反序列化。下面是使用显式反序列化修改后的代码:
字符串
在上面的代码中,我们使用
Newtonsoft.Json.Linq
命名空间中的JObject.Parse
方法显式解析从Oracle DB获得的CLOB中的JSON数据。如果解析成功,我们将dbJsonData
对象添加到statusObj
。如果在解析过程中出现异常(例如,CLOB中的JSON格式无效),我们只需跳过将数据从DB添加到statusObj
,并返回不包含DB数据的statusObj。通过显式地反序列化来自CLOB的JSON数据并将其包含在响应中,您应该能够解决这个问题并确保使用者接收到正确的JSON数据。