使用 T-SQL 从 RESTful API 解析 JSON

Posted

技术标签:

【中文标题】使用 T-SQL 从 RESTful API 解析 JSON【英文标题】:Parsing JSON from RESTful API with T-SQL 【发布时间】:2019-08-24 17:36:21 【问题描述】:

我想将来自 SurveyHero 的 RESTful api 使用到 SQL Server,我有两个问题:

我将如何直接在 SQL SERVER 中使用需要 BasicAuth 的 RESTful API。 我尝试使用 C# 中的 API 并将 JSON 数据传递给 SQL Server,并尝试使用 OPENJSON() 函数解析 JSON 数据。

API返回的json如下:


    "surveys": [
        "survey_id": 94242,
        "title": "title here",
        "created_on": "2018-10-19T00:05:28+00:00",
        "number_of_questions": 47,
        "number_of_responses": 1403
    , 
        "survey_id": 125865,
        "title": "title 2 here",
        "created_on": "2019-03-15T00:38:11+00:00",
        "number_of_questions": 45,
        "number_of_responses": 9109
    ]

现在我尝试了下面的 OPENJSON 函数:

SELECT *  
FROM OPENJSON(@json)  
  WITH (id int 'strict $.surveys.survey_id', title nvarchar(100) '$.surveys.title', createddate datetime '$.surveys.created_on')

上述查询失败并抛出以下错误:

JSON path is not properly formatted. Unexpected character '0' is found at position 0.

但是,如果我从根目录中删除 "surveys":[,它可以正常工作,但是当我调用 API 时,它总是只返回这种方式,有人能建议我如何正确解析 JSON 吗?

【问题讨论】:

如果可以使用c#,为什么不解析其中的json并将属性作为列存储在SQL Server的表中? 【参考方案1】:

我无法重现您的错误...

DECLARE @YourJson NVARCHAR(MAX)=
N'
    "surveys": [
        "survey_id": 94242,
        "title": "title here",
        "created_on": "2018-10-19T00:05:28+00:00",
        "number_of_questions": 47,
        "number_of_responses": 1403
    , 
        "survey_id": 125865,
        "title": "title 2 here",
        "created_on": "2019-03-15T00:38:11+00:00",
        "number_of_questions": 45,
        "number_of_responses": 9109
    ]
';

--它似乎是有效的 JSON

SELECT ISJSON(@YourJson);

--由于您的对象是一个数组,您需要稍微改变路径和 datetime2 来检索一个元素(索引“0”是第一个):

SELECT *  
FROM OPENJSON(@YourJson)  
  WITH (id int 'strict $.surveys[0].survey_id', title nvarchar(100) '$.surveys[0].title', createddate datetime2 '$.surveys[0].created_on')

在这种情况下,OPENJSON 的用法是错误的。使用SELECT JSON_VALUE(@YourJson, 'strict $.surveys[0].survey_id') 会达到完全相同的效果...

你真正需要的,好像是这个

SELECT TheSurvey.*  
FROM OPENJSON(@YourJson,'$.surveys')  
  WITH (id INT '$.survey_id'
       ,title NVARCHAR(MAX)
       ,createddate DATETIME2 '$.created_on') TheSurvey 

最后一个示例将读取surveys-array 逐行。您可以使用SELECT * FROM OPENJSON(@YourJson,'$.surveys'); 测试中间结果。 WITH-clause - 因为 OPENJSON() 返回原始 JSON 的 fragments - 现在需要 relative 路径。

【讨论】:

以上是关于使用 T-SQL 从 RESTful API 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数解析为 RESTful API

nodejs + mongodb 编写 restful 风格博客 api

在 RESTful API 中解析 URI 参数

Woocommerce RESTful API的字符串格式

如何解析从 T-SQL 查询返回的行

笔记︱利用python + flask制作一个简易本地restful API