【问题标题】:MySQL JSON Parsing - Escaped Json-within-JsonMySQL JSON 解析 - 转义的 Json-within-Json
【发布时间】:2022-01-18 21:37:01
【问题描述】:

我在使用内置 MySQL JSON 函数从嵌套在 JSON 字符串中的 JSON 字符串中解析出值时遇到问题。

这是一个示例:

{
  "SucceededAt": "2022-01-18T07:54:50.5548083Z",
  "PerformanceDuration": "1463",
  "Latency": "91",
  "Result": "\"Request Body: {\\\"request\\\":[{\\\"id\\\":[{\\\"value\\\":\\\"1\\\"}],\\\"roles\\\":{\\\"receiver\\\":{\\\"id\\\":[{\\\"value\\\":\\\"1115559991\\\"}]}},\\\"details\\\":{\\\"adjustmentAmount\\\":{\\\"value\\\":7800}}}]}, Response Body:{\\\"response\\\":[{\\\"id\\\":[{\\\"value\\\":\\\"1\\\"}],\\\"parts\\\":{\\\"specification\\\":{\\\"characteristicsValue\\\":[{\\\"characteristicName\\\":\\\"MSISDN\\\",\\\"value\\\":\\\"9998885556\\\"},{\\\"characteristicName\\\":\\\"ResponseCode\\\",\\\"value\\\":\\\"1000\\\"},{\\\"characteristicName\\\":\\\"ResponseDescription\\\",\\\"value\\\":\\\"Operation successfully.\\\"}]}}}]}\""
}

我想从“结果”键/值中获取“请求”和响应“键/值对。

当我使用SELECT JSON_VALUE(Data, '$.Result') FROM [...] 从“Result”键中提取值时,它返回转义的字符串值(我认为还是 json-within-json)如下(使用双引号字符) :

"Request Body: {\"request\":[{\"id\":[{\"value\":\"1\"}],\"roles\":{\"receiver\":{\"id\":[{\"value\":\"114787601\"}]}},\"details\":{\"adjustmentAmount\":{\"value\":7800}}}]}, Response Body:{\"response\":[{\"id\":[{\"value\":\"1\"}],\"parts\":{\"specification\":{\"characteristicsValue\":[{\"characteristicName\":\"MSISDN\",\"value\":\"114787601\"},{\"characteristicName\":\"ResponseCode\",\"value\":\"1000\"},{\"characteristicName\":\"ResponseDescription\",\"value\":\"Operation successfully.\"}]}}}]}"

这是我坚持的步骤。

有没有办法使用内置的 MySQL JSON 函数来做到这一点?

【问题讨论】:

  • result 的值不是有效的 JSON,它需要 {} 在对象周围。
  • 啊,你是对的。所以基本上我需要清理 JSON_VALUE 的结果(添加 {},删除包装双引号,并替换转义字符,然后将其解析为自己的 JSON
  • 是的,应该可以。它不会很漂亮,但是在 MySQL 中使用 JSON 没有什么是漂亮的。
  • select version(); 显示什么?
  • @ysth - MySQL 版本是 8.0.23

标签: mysql json mysql-json


【解决方案1】:

您可以使用 JSON_UNQUOTE 获取 JSON_VALUE 返回的 json 字符串并将其转换为原始字符串值。然后使用 substring_index 解析出请求正文:和响应正文:,假设它们的格式与您的示例中所示的完全相同(冒号后是否真的有空格表示请求但没有响应?):

select
    substring_index(substring_index(json_unquote(json_value(Data, '$.Result')),', Response Body:',1),'Request Body: ',-1) as request,
    substring_index(json_unquote(json_value(Data, '$.Result')),', Response Body:',-1) as response
from foo;

fiddle

substring_index(foo,bar,1) 获取 foo 中第一个 bar 之前的所有内容(如果未找到 bar,则返回整个字符串)。 substring_index(foo,bar,-1) 获取 foo 中最后一个 bar 之后的所有内容(如果未找到 bar,则返回整个字符串)。

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 2015-10-16
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2022-01-22
    • 2020-12-06
    相关资源
    最近更新 更多