JsonConvert.serializeObject 数据集返回意外结果

JsonConvert.serializeObject with dataset returning unexpected result

我正在尝试将数据集转换为 .net core 2.0 中的 JSON,并使用以下代码来完成此操作

return Ok(JsonConvert.SerializeObject(dataset, Formatting.Indented))

我得到的输出是

"{\n \"DataSet.RemotingVersion\": {\n \"Major\": 2,\n \"Minor\": 0,\n \"Build\": -1,\n \"Revision\": -1,\n \"MajorRevision\": -1,\n \"MinorRevision\": -1\n },\n \"XmlSchema\": \"<?xml version=\\"1.0\\" encoding=\\"utf-16\\"?>\n<xs:schema id=\\"dataset\\" xmlns=\\"\\" xmlns:xs=\\"http://www.w3.org/2001/XMLSchema\\" xmlns:msdata=\\"urn:schemas-microsoft-com:xml-msdata\\">\n <xs:element name=\\"dataset\\" msdata:IsDataSet=\\"true\\" msdata:UseCurrentLocale=\\"true\\">\n <xs:complexType>\n <xs:choice minOccurs=\\"0\\" maxOccurs=\\"unbounded\\">\n <xs:element name=\\"datatable\\">\n <xs:complexType>\n <xs:sequence>\n <xs:element name=\\"cvbf\\" type=\\"xs:string\\" msdata:targetNamespace=\\"\\" minOccurs=\\"0\\" />\n </xs:sequence>\n </xs:complexType>\n </xs:element>\n </xs:choice>\n </xs:complexType>\n </xs:element>\n</xs:schema>\",\n \"XmlDiffGram\": \"<diffgr:diffgram xmlns:msdata=\\"urn:schemas-microsoft-com:xml-msdata\\" xmlns:diffgr=\\"urn:schemas-microsoft-com:xml-diffgram-v1\\" />\"\n}"

我是 C# 开发的新手,

你这里有两个问题:

  1. 您似乎正在按照 JSON.NET Parser seems to be double serializing my objects. First you manually serialize your returned object to a string, then call Ok(object) 中描述的方式对您的 dataset 进行双重序列化,其中 序列化传入的对象(即 JSON 字符串),导致嵌套序列化。

    解决办法是不这样做。只需执行 return Ok(dataset);

  2. 让框架为您序列化您的对象
  3. Update. Json.NET 11.0 Release 1 支持 .NET Standard 2.0,因此现在可以对 DataSetDataTable 进行序列化在 .Net 核心中使用此版本和更高版本。您需要升级到此版本或后续版本。

    原始答案。你的第二个问题是你试图在 .Net 核心中使用 Json.NET 序列化 DataSet 和 Json.NET 10.0.3 or earlier -- and unfortunately doing so is not yet supported. As explained in Issue #1409: serializes a DataSet to JSON on dotnet core 2.0 and Issue #1383: .Net core build doesn't include DataTableConverter,此版本的 Json.NET 以 netstandard 1.3 为目标,而 DataSetDataTable 是在 netstandard 1.5 中引入的。因此,此版本没有在 .Net 核心中序列化这些类型的内置逻辑。

    那么,您使用这个版本有哪些选择?首先,Json.NET 是根据 MIT License so you could copy its versions of DataSetConverter and DataTableConverter, include them in your project, and add them to JsonSerializerSettings.Converters. The question JsonSerializerSettings and Asp.Net Core 获得许可的,展示了如何在 ASP.NET Core 中自定义设置。

    其次,您可以将您的 DataSet 转换为 DTO,然后将 return 转换为 return。例如,以下扩展方法将任何 DataSet 转换为 Dictionary<string, List<Dictionary<string, object>>>,它可由 Json.NET 序列化:

    public static class DataSetExtensions
    {
        public static List<Dictionary<string, object>> ToDictionaryList(this DataTable table)
        {
            if (table == null)
                return null;
            return table.Rows.Cast<DataRow>()
                .Select(r => table.Columns.Cast<DataColumn>().ToDictionary(c => c.ColumnName, c => r[c]))
                .ToList();
        }
    
        public static Dictionary<string, List<Dictionary<string, object>>> ToDictionary(this DataSet set)
        {
            if (set == null)
                return null;
            return set.Tables.Cast<DataTable>()
                .ToDictionary(t => t.TableName, t => t.ToDictionaryList());
        }
    }
    

    更好的是,为 return 创建一个强类型模型。 (如果您还序列化为 XML 那么这是更好的解决方案,因为 XmlSerializer 不支持字典的序列化。)

截至 2018 年 4 月 25 日。我有完全相同的问题。下载最新版本的 Newtonsoft。我升级到 11.0.2。它现在适用于 ASP Core 2。数据集被转换为 JSON。