c# - C#:带有 JsonConvert.SerializeObject() 的 Dapper 无法正常工作
问题描述
我是 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 字符串?
这是我的代码。我还对我得到的不正确的输出进行了摆弄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);
}
}
}
推荐阅读
- sql-server - 来自 CTE 的多个 COUNT(DISTINCT)
- php - 如果在php中为真,如何跳过条件?
- ajax - 如果部分预订日,则将 partial_book_days 更改为 fully_booked_days
- csv - Spark CSV GZip 到 Parquet?
- java - 递归选择排序(Java Eclipse Neon 2)
- java - 获取图像并在gridview中显示
- python-3.x - 使用 ndarray、prod 和 cumprod python
- android - 滚动列表视图后如何在按钮上设置焦点(设置可见性)
- angular - 路由器将编码导航到地址栏中的 %3d angular5
- microsoft-graph-api - 无法在 OneNote 页面中进行两项更改