1

我有一个 json,我想提取一个键的值。我知道密钥名称但不知道位置。我的 json 很复杂,在 mysql 中看起来像这样:

set @jsonstr:='
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}
';

例如,我想搜索键“Acronym”。我想要完整路径/或直接它的值[“SGML”],以便我可以进一步处理它。

我在做下面的事情,它让我返回 null

select JSON_Search(@jsonstr,'all', '%Acronym%')

我的要求:

  • 我的 json 中可能有多个“首字母缩略词”,我只想要它们。
  • 我没有价值部分,我只知道关键
  • 我的 json 对于嵌套对象和数组很复杂


编辑

它起作用了,所以我现在尝试使用我更新的json,看起来像

    set @jsonstr:='
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"],
                        "Acronym" : "another value"
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}
';

所以现在查询

select JSON_EXTRACT(@jsonstr,'$**.Acronym')

回来

[“SGML”,“另一个值”]

但是像这样我将无法获取具有我的目标密钥的各个位置的路径。

问题: 如果我能得到一个表,其中“关键位置”作为第一列,它们各自的值在第二列。

4

2 回答 2

3

我想你想要这个查询:

SELECT JSON_EXTRACT(@jsonstr,'$**.Acronym')

JSON_Search 在 JSON 对象中查找值。您知道要查找的密钥的名称,因此您只需要使用路径,该路径在https://dev.mysql.com/doc/refman/5.7/en/json-path-syntax 中有说明。在https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-search上带有示例的html

于 2018-02-16T16:29:26.043 回答
1

可能为时已晚,但试试这个:

SET @junkJs:=JSON_OBJECT('a', JSON_OBJECT('b', 'xxxx'));

SET @x:=JSON_SEARCH(replace(@junkJs, '"b":', '"j":"junk", "b":'), 'all', 'junk');

select replace(@x, '.j', '');
于 2019-09-04T06:14:28.493 回答