C#:带有 JsonConvert.SerializeObject() 的 Dapper 无法正常工作

C#: Dapper with JsonConvert.SerializeObject() not working properly

我是 Newtonsoft.Json 和 Dapper 的新手。

我正在执行 SQL 查询,并使用查询的结果将其转换为 JSON 字符串以使其看起来像这样:

{ "Orders" : [{"OrderID":10248, "Quantity":12}, {"OrderID":10343, "Quantity":4}, ...etc...]}

然而,当我 运行 我的 C# 代码时,我的输出看起来完全不同,还有一些意外的添加:

[
  {
    "JSON_F52E2B61-18A1-11d1-B105-00805F49916B": "{\"Orders\":[{\"OrderID\":10248,\"Quantity\":12},{\"OrderID\":10248,\"Quantity\":10}{\"OrderID\":10271,\"Quantity\":24},{\"OrderID\":10272,\"Quantity\":6},{\"OrderID\":1027"
  },
  {
    "JSON_F52E2B61-18A1-11d1-B105-00805F49916B": "2,\"Quantity\":40},{\"OrderID\":10272,\"Quantity\":24}, ...etc... ]

如您所见,我不明白为什么要添加额外的“JSON_F52E2B61-18A1-11d1-B105-00805F49916B”。我如何删除这些?如何更改我的代码以使其看起来像我想要的输出 json 字符串?

这是我的代码。我还制作了一个 fiddle,但我得到的输出不正确 https://dotnetfiddle.net/uWV6vs :

// Dapper Plus
// Doc: https://dapper-tutorial.net/query

// @nuget: Dapper -Version 1.60.6
using Newtonsoft.Json;   
using Dapper;
using System;
using System.Data.SqlClient;
                    
public class Program
{    
    public class OrderDetail
    {
        public int OrderDetailID { get; set; }
        public int OrderID { get; set; }
        public int ProductID { get; set; }
        public int Quantity { get; set; }
    }
    
    public static void Main()
    {
        string sql = "SELECT OrderID, Quantity FROM OrderDetails FOR JSON PATH, root ('Orders'), INCLUDE_NULL_VALUES";

        using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
        {   
            dynamic orderDetail = connection.Query(sql);
            //edit: the answer is to use connection.Query<string>, orderDetail[0]
            orderDetail = JsonConvert.SerializeObject(orderDetail,Formatting.Indented); 
            Console.WriteLine(orderDetail);     
        }
    }
}

我相信你不需要向SQL请求JSON,Dapper会自动将结果解析为对象

删除“FOR JSON PATH, root ('Orders'), INCLUDE_NULL_VALUES”应该会有所帮助

string sql = "SELECT OrderID, Quantity FROM OrderDetails";

更新:

抱歉,请继续更新答案。这个为您提供具有正确结构且没有额外反斜杠的对象

using Newtonsoft.Json;   
using Dapper;
using System;
using System.Data.SqlClient;
using System.Collections.Generic;
                    
public class Program
{    
    public class OrderDetail
    {
        public int OrderDetailID { get; set; }
        public int OrderID { get; set; }
        public int ProductID { get; set; }
        public int Quantity { get; set; }
    }
    
    public class Result
    {
        public IEnumerable<OrderDetail> Orders { get; set; }
    }
    
    public static void Main()
    {
        string sql = "SELECT OrderID, Quantity FROM OrderDetails";

        using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
        {   
            var orderDetail = connection.Query<OrderDetail>(sql);
            var str = JsonConvert.SerializeObject(new Result { Orders = orderDetail },Formatting.Indented); 
            Console.WriteLine(str);     
        }
    }
}