额外的括号“{”来自 SQL 服务器的 JSON 输出

Extra parenthesis '{' is coming in JSON output from SQL server

我是 JSON 的新手,想直接从 SQL 服务器生成 JSON 输出。

但是在从 C#.net 调用 SP 时,我在开头得到了一个额外的“{”括号。 并且在尝试将 JSON 存储到 SQL 中时,它给出了错误提示 JSON.

无效

下面是我的存储过程代码。

Create PROCEDURE [dbo].[GetData]
As 
BEGIN

SELECT Trucknumber,
        (
        select * from TruckDetails
        where TruckId = Truckmaster.TruckId
        FOR JSON AUTO
        ) AS CompData  
    FROM Truckmaster
Where TruckNumber = 'HP09A3487' 
FOR JSON AUTO

END

C#代码------------------------------------

public StringBuilder RunStoredProcedureWithString(string strSPName)
        {
            StringBuilder jsonResult = new StringBuilder();

            var queryWithForJson = "exec " + strSPName;
            var conn = new SqlConnection(GenerateConnectionString(_DBName));
            var cmdNew = new SqlCommand(queryWithForJson, conn);
            conn.Open();
            var reader = cmdNew.ExecuteReader();
            if (!reader.HasRows)
            {
                jsonResult.Append("[]");
            }
            else
            {
                while (reader.Read())
                {
                   jsonResult.Append(reader.GetValue(0).ToString());
                }
            }
            return jsonResult;
        }

正在调用存储过程。

 var strJson = objDBSupport.RunStoredProcedureWithString("GetData");
 if(strJson.Length > 0)
 {
//Success
 }

期望的输出并且也在 SQL。

[{"Trucknumber":"HP09A3487","CompData":[{"TruckId":37886,"CompNo":1,"Capacity":6000},{"TruckId":37886,"CompNo":2,"Capacity":4000},{"TruckId":37886,"CompNo":3,"Capacity":3000},{"TruckId":37886,"CompNo":4,"Capacity":5000}]}]

C# 中的输出带有额外的“{”,无法插入另一个 Table。

{[{"Trucknumber":"HP09A3487","CompData":[{"TruckId":37886,"CompNo":1,"Capacity":6000},{"TruckId":37886,"CompNo":2,"Capacity":4000},{"TruckId":37886,"CompNo":3,"Capacity":3000},{"TruckId":37886,"CompNo":4,"Capacity":5000}]}]}

有什么建议吗?

我重现了您的设置,但无法重现任何问题。我怀疑您这样做是为了查看您的数据:

Visual Studio 添加最外层的 { } 纯粹是为了在调试器中显示。它们不是您数据的一部分。这里我的数据肯定没有{} in:

它对您检查的每个对象执行此操作:

A StringBuilder 有一个覆盖 ToString 显示内容而不是类型名称(objectToString 的默认行为),因此内容SB 出现在调试器工具提示中,在 { } 内。因为 { 看起来像 JSON 你会感到困惑..


查看直接 window 在“对象表示”与“字符串表示”中的区别

请注意,字符串表示中 " 之前的那些 \ 也不在您的数据中;它们是在可视化字符串时添加的,以便更容易地将字符串作为文字粘贴到代码中


如果您想在没有这些操作的情况下真正查看您的数据,请将其放入字符串中,然后单击 StringBuilder 工具提示中的放大镜(有多种可视化选项):

您会在文本框中看到该字符串,就像您将其写入文件并在记事本中打开它一样

如果这种可视化混淆不是真正的问题,post 一张显示您如何确定数据的屏幕截图有额外的 {},因此我们可以看到您的思维过程并从中反省