JSON 使用散列键在 SQL 中解析

JSON parse in SQL with hash key

我有一个 table 和 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

但是我有一个错误

Msg 13607, Level 16, State 4, Line 39 JSON path is not properly formatted. Unexpected character '0' is found at position 2.

有人知道吗?

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

您的实际 JSON 也有问题,因为它有尾随逗号,SQL 服务器不支持,绝大多数解析器和浏览器也不支持,因为它不符合规范。


如果每个值有不同的键名,那么您需要用 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