【问题标题】:Cannot access keys by index with OPENJSON无法使用 OPENJSON 按索引访问键
【发布时间】:2018-04-24 15:45:37
【问题描述】:

在 SQL 中,如何通过索引[0] 提取键的值?或者,从这个 JSON 结构中提取值的最佳方法是什么?

declare @jsonString nvarchar(max)

set @jsonString = '{
"action": "edit",
"data": {
    "Accountable Inventory Technician|99999": {
        "PosTitle": "Accountable Inventory TECH",
        "Publish": "true"
    }
}
}'

这将为我提供键的名称,“动作”和“数据”:

select [key]
from OPENJSON(@jsonString, '$')

这将为我提供数据“Accountable Inventory Technician...”下第一个键的值:

select *
from OPENJSON(@jsonString, '$.data')

我无法获得“行动”的价值。这不返回任何内容:

select *
from OPENJSON(@jsonString, 'lax $.action')

我无法通过索引引用。这不返回任何内容:

select *
from OPENJSON(@jsonString, '$.data[0].PosTitle')

我做错了什么?

【问题讨论】:

    标签: json tsql datatables jquery-datatables-editor


    【解决方案1】:

    在 SQL 中,如何通过索引 [0] 提取键的值?或者,什么是 从这个 JSON 结构中提取值的最佳方法是什么?

    JSON 索引用于数组。例如,如果您的 JSON 具有 ["some","values","in","an","array"],那么引用 [0] 项将具有 "some" 值。 您的示例没有数组,因此您将无法以这种方式访问​​它。

    我无法获得“行动”的价值。

    使用JSON_VALUE,您可以访问对象中的特定项目:

    SELECT JSON_VALUE(@jsonString, '$.action') [action];
    SELECT JSON_VALUE(@jsonString, '$.data."Accountable Inventory Technician|99999".PosTitle') PosTitle;
    

    如果您的 JSON 存储在表中,您可以使用 OPENJSONCROSS APPLY 访问它

    DROP TABLE IF EXISTS #json 
    CREATE TABLE #json (JsonString NVARCHAR(MAX));
    
    INSERT #json SELECT '{
        "action": "edit",
        "data": {
            "Accountable Inventory Technician|99999": {
                "PosTitle": "Accountable Inventory TECH",
                "Publish": "true"
            }
        }
        }'
    
    SELECT * FROM #json j
    CROSS APPLY
    OPENJSON(j.JsonString)
    WITH
        (
            [Action] varchar(255) '$.action',
            PosTitle varchar(255) '$.data."Accountable Inventory Technician|99999".PosTitle'
        );
    

    【讨论】:

    • 所以我应该使用 JSON_VALUE 代替?!谢谢!!容易多了!我正在处理字符串(没有表格)。我需要引用'$.data."Accountable Inventory Technician|99999" 键,但它是可变的,我不知道它的名称。有没有办法引用data 下的第一个键? select json_value(@jsonString, '$.data.["key[0]"].PosTitle') 之类的东西?或者,没有[array] 就没有办法?我需要重组 JSON 吗?
    • 您是否也关心 Key 名称或只关心 "Accountable Inventory Technician|99999" 的值?
    • 目前,我只关心获取 PostTitle 和 Publish 的值。当他的父对象可能有不同的名称时,我不知道该怎么做。 "Accountable Inventory Technician|99999", "Another Job Title|87699"
    • 如果您可以控制 JSON 结构,我会尽量展平所有内容,并始终通过$.keyName 访问它(当然,除非您需要数组或嵌套对象)。您可以尝试这样的事情:SELECT final.[key] yourDynamicKey, json_value(final.value, '$.PosTitle') PosTitle FROM #json j CROSS APPLY OPENJSON(j.JsonString) ref CROSS APPLY OPENJSON(ref.value) final WHERE ref.[key] = 'data' 使用您当前的结构。
    • this 是了解您的选择的好地方。
    猜你喜欢
    • 2011-08-14
    • 2023-03-05
    • 2017-08-18
    • 1970-01-01
    • 2022-01-01
    • 2022-01-07
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多