【问题标题】:JSON parse in SQL with hash key使用哈希键在 SQL 中解析 JSON
【发布时间】:2021-01-31 07:17:10
【问题描述】:

我有一个带有 JSON 列的表。在本专栏中,我有一个区块链哈希数据。 例如这个 JSON:

{  "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894": {
"transaction": {
  "block_id": 648895,
  "id": 568135560,
  "hash": "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894",
  "date": "2020-01-14",
  "time": "2020-01-14 11:37:37",
  "size": 198,
},
"inputs": [
  {
    "block_id": 648859,
    "transaction_id": 567456558,
    "index": 4,
    "transaction_hash": "8aa2c6c9a804mate29790e03fac462782d99f16614732f82a5214786926e1397",
    "date": "2020-01-13",
    "time": "2020-01-13 23:15:37",
    "value": 300830,
    "value_usd": 33.2264,
    "recipient": "1LcrmomE74BPzBTdduE8WHU2ox4QAFEpQi",

  }
],
"outputs": [
  {
    "block_id": 648445,
    "transaction_id": 568146680,
    "index": 0,
    "transaction_hash": "017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894",
    "date": "2020-01-14",
    "time": "2020-01-14 11:37:37",
    "value": 300048,
    "value_usd": 31.9397,
    "recipient": "12UJZqf4sDGRNb9uYBABJkMyX91iLjDViT",

  }
]}} 

我使用了以下查询:

SELECT *, JSON_VALUE(d.json_data,'$.017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894.transaction.size') as jj
FROM BlockChain as d

但我有一个错误

消息 13607,第 16 级,状态 4,第 39 行 JSON 路径格式不正确。在位置 2 发现意外字符“0”。

有人知道吗?

【问题讨论】:

    标签: json sql-server blockchain sql-server-2019


    【解决方案1】:

    路径
    '$.017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894.transaction.size'
    不能有以 0 开头的节点。So enclose it in quotes:
    '$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction.size'

    您的实际 JSON 也存在问题,因为它有尾随逗号,这在 SQL Server 中不受支持,在绝大多数解析器和浏览器中也不支持,因为它违反规范。


    如果每个值都有不同的键名,那么你需要用OPENJSON 分解JSON:

    SELECT b.*, j.[key] AS hash, JSON_VALUE(j.value,'$.transaction.size') as jj
    FROM BlockChain as d
    CROSS APPLY OPENJSON(d.json_data) AS j
    

    【讨论】:

    • 用这个 '$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction.size' 不幸返回 null !!
    • 你确定那个键完全匹配吗?
    • 对不起。你的答案是正确的。我调用 '$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction 返回 null。但是 '$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction.size 返回正确答案。
    • 已对更改哈希键进行了进一步更新
    猜你喜欢
    • 2011-11-24
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多