Синтаксический анализ JSON в SQL с помощью хэш-ключа

#json #sql-server #blockchain #sql-server-2019

#json #sql-сервер #блокчейн #sql-server-2019

Вопрос:

У меня есть таблица со столбцом 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’.

У кого-нибудь есть идеи?

Ответ №1:

Путь
'$.017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894.transaction.size'
не может иметь узел, начинающийся с 0. Поэтому заключите его в кавычки:
'$."017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894".transaction.size' .

У вас также есть проблема с вашим фактическим JSON, поскольку он имеет конечные запятые, что не поддерживается ни в SQL Server, ни в подавляющем большинстве анализаторов и браузеров, поскольку это противоречит спецификации.


Если у вас разные имена ключей для каждого значения, вам нужно разбить JSON с помощью OPENJSON :

 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
 

Комментарии:

1. с этим ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.transaction.size» к сожалению, возвращает null!!

2. Вы уверены, что это точное совпадение по этому ключу?

3. извините. ваш ответ правильный. Я вызываю ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.транзакция, которая возвращает null. но ‘$.»017989w06d3f902f1f362dfg48f862dba6a605229e99859a91d854f93ac13894″.transaction.size возвращает правильный ответ.

4. Внесли дополнительные обновления для изменения хэш-ключей