swagger 当服务被调用时,JSON在日志中显示完全正确,但缺少几乎所有的消费者文本

3bygqnnd  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个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
        }
      ]
    }
  ]
}

smdnsysy

smdnsysy1#

您所面临的问题似乎与向消费者返回响应时JSON数据的序列化有关。数据在打印到控制台时显示正确,但在消费者接收时显示错误。
这种行为最可能的原因是,在响应生成过程中,Oracle DB中的一些数据(存储为带有JSON约束的CLOB)没有被正确地序列化。要解决此问题,可以在将CLOB中的JSON数据添加到statusObj之前显式地将其反序列化。
下面是使用显式反序列化修改后的代码:

using Newtonsoft.Json.Linq; // Import the Newtonsoft.Json.Linq namespace

app.MapGet("/status/batchId={batchId}", (decimal batchId) => getStatus(batchId));

object getStatus(decimal id)
{
    var statusObj = new
    {
        batchId = id,
        // ...
    };

    // Code here to pull JSON from DB as a CLOB
    // Let's assume the JSON data from the DB is stored in the variable "jsonFromDb"

    // Explicitly deserialize the JSON data from the CLOB
    JObject dbJsonData = null;
    try
    {
        dbJsonData = JObject.Parse(jsonFromDb);
    }
    catch (Exception ex)
    {
        // Handle the exception if the parsing fails
        // Log the error or take appropriate action
        // For now, we'll just return the original statusObj without the data from the DB
        return statusObj;
    }

    // Add the deserialized data to the statusObj
    statusObj["dataFromDB"] = dbJsonData;

    // Rest of your code ...

    Console.WriteLine(JsonConvert.SerializeObject(statusObj));

    return statusObj;
}

字符串
在上面的代码中,我们使用Newtonsoft.Json.Linq命名空间中的JObject.Parse方法显式解析从Oracle DB获得的CLOB中的JSON数据。如果解析成功,我们将dbJsonData对象添加到statusObj。如果在解析过程中出现异常(例如,CLOB中的JSON格式无效),我们只需跳过将数据从DB添加到statusObj,并返回不包含DB数据的statusObj。
通过显式地反序列化来自CLOB的JSON数据并将其包含在响应中,您应该能够解决这个问题并确保使用者接收到正确的JSON数据。

相关问题