SQL Server的JSON输出格式

时间:2019-01-12 15:37:29

标签: json sql-server

我昨天发布了一个与此有关的问题,解决主义者非常有帮助地回答了这个问题,但是我现在有一个类似的跟进问题。

我想从JSON中获取两套数据。

我有三个数据集,一个是标题,一个是一组客户记录,最后一个是错误对象。 我希望尝试获得的结构是: 标头   顾客   错误

但是我得到的是: 标头   客户,错误   客户,错误

现在在此示例中,该错误为null,因此我很高兴因该错误为null而被忽略,或者作为一个空对象返回,但我希望一个,而不是每个客户一个。

这是我目前得到的:

select isjson('{"APIResult":[{"ID":200,
               "Status_Message":"Success",
               "Developer_Message":"Customers found",
           "User_Message":"Customers found",
           "Return_Code":0,
           "Customer":[{"ID":"A6B10FA0-85AD-422D-8A7E-07EEA541593E",
                        "First_Name":"Bbb",
                        "Paternal_Last_Name":"Bbbbb",
                        "Email_Address":"bbbb@example.com",
                        "Error":[{}]
                       },
                       {"ID":"91EE2FD6-2C40-4CFD-ABB7-2CDAE3624487",
                        "First_Name":"Aaaa",
                        "Paternal_Last_Name":"Aaaaa",
                        "Email_Address":"aaaaa@example.com",
                        "Error":[{}]
                       }]
           }]
}')

这就是我想要得到的:

select isjson('{"APIResult":[{"ID":200,
            "Status_Message":"Success",
            "Developer_Message":"Customers found",
            "User_Message":"Customers found",
            "Return_Code":0,
            "Customer":[{"ID":"A6B10FA0-85AD-422D-8A7E-07EEA541593E",
                         "First_Name":"Bbb",
                         "Paternal_Last_Name":"Bbbbb",
                         "Email_Address":"bbbb@example.com"
                        },
                        {"ID":"91EE2FD6-2C40-4CFD-ABB7-2CDAE3624487",
                         "First_Name":"Aaaa",
                         "Paternal_Last_Name":"Aaaaa",
                         "Email_Address":"aaaaa@example.com"
                        }],
            "Error":[{}]

           }]
}')

两者都是有效的JSON(正如您所看到的,我这次已经测试过),但是我不知道如何获取第二种格式。

这是我正在运行以获取输出的查询:

declare @returncode int = 0
       ,@VerboseMsg nvarchar(4000) = 'Customers found'
       ,@DisplayMsg nvarchar(4000) = 'Customers found'
CREATE TABLE #Customers (CustomerID UNIQUEIDENTIFIER DEFAULT(NEWID()), FirstName NVARCHAR(50), PaternalLastName NVARCHAR(50), EmailAddress NVARCHAR(250))
INSERT INTO #Customers (FirstName, PaternalLastName, EmailAddress)
VALUES ('Aaaa', 'Aaaa', 'aaaa@example.com'), ('Bbbb', 'Bbbb', 'bbbb@example.com')

SELECT st.APIStatus AS 'ID'
      ,st.StatusMessage AS 'Status_Message'
      ,@VerboseMsg AS 'Developer_Message'
      ,@DisplayMsg AS 'User_Message'
      ,st.ReturnCode AS 'Return_Code'
      ,[Customer].CustomerID AS 'ID'
      ,[Customer].FirstName AS 'First_Name'
      ,[Customer].PaternalLastName AS 'Paternal_Last_Name' 
      ,[Customer].EmailAddress AS 'Email_Address'
      ,[Error].ErrorCode AS 'Error_Code'
      ,[Error].ErrorMsg AS 'Error_Message'
FROM (SELECT 200 AS APIStatus, 'Success' AS StatusMessage, @ReturnCode AS ReturnCode) st
LEFT JOIN (SELECT CustomerID 
                 ,FirstName 
                 ,PaternalLastName 
                 ,EmailAddress
                 ,@ReturnCode AS ReturnCode
           FROM #Customers
          ) As [Customer]
ON st.ReturnCode = [Customer].ReturnCode
LEFT JOIN (SELECT @ReturnCode AS ErrorCode, @DisplayMsg AS ErrorMsg WHERE @returncode != 0) AS [Error]
ON [Error].ErrorCode = st.ReturnCode
FOR JSON AUTO, ROOT('APIResult')

是否只有我自己将东西缝合在一起才能获得此输出? JSON对我来说仍然很新,我正努力了解它的构成。

1 个答案:

答案 0 :(得分:0)

在此设置中,我将在返回代码后放置错误代码,并使用带有JSON PATH的子查询,如下所示:

 @yield('content')

请注意,如果您在Error中没有任何记录,则将其省略,但是在这种情况下可以使用null,我也注意到您使用过两次@ReturnCode,但我不知道这是否是有意的或错误。