如何从 sql 查询中提取 JSON?

How to extract JSON from sql query?

我的查询如下所示:

 select MESSAGE, OFFSET from SRV_TABLE where STATUS='404';

我想重试失败的消息,但消息是 json 字符串,偏移量是常规字符串。我需要提取 json 消息和偏移字符串,然后遍历每一行。我该怎么做?现在我正在做这样的事情:

public void retryFailedMessages() {
    JsonNode failedMessages = service.getFailedMessages();
    Iterator<JsonNode> iter = failedMessages.elements();
    while(iter.hasNext()) {
        JsonNode message = iter.next();
        String mess = message.get("MESSAGE").toString();
        String offset = message.get("OFFSET").toString();
        service.retry(mess, offset);
    }

}

//服务

String responseString = "";
JsonNode responseObj = null;
List<String> responseList;

try{
    responseLIst = dataAccessLayer.getFailedMessages();
    responseString = buildQueryResult(responseList);
    responseObj = objectMapper.readTree(responseString);
} catch( Exception e) {
    e.printStackTrace();
}

return responseObj;

buildQueryResult() 只是将所有字符串附加在一起,以便映射器可以一起读取它。映射器忽略偏移量并且不将其包含在 json 中,因为它不是有效的 json。如何保留偏移量和消息并将两者传递给 service.retry() 方法?

您需要将 string/json 转换为 POJO 或以其他方式将其转换为对象。我建议您使用 Jackson 库并将其映射到 pojo。

另一种方法是使用数据库中的一些工具直接查询:

select 
    JSON_VALUE(MESSAGE, '$.your.query') as query,
    JSON_VALUE(MESSAGE, '$.another.query') as another,
    OFFSET
from SRV_TABLE where STATUS='404';

通过这种方式,您可以在代码中将值作为字符串处理。

可以在这里阅读更多内容:https://docs.microsoft.com/en-us/sql/t-sql/functions/json-value-transact-sql?view=sql-server-ver15