繁体   English   中英

带有数据集的 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# 开发很陌生,

  • 如何将其转换为正确的 JSON?
  • 为什么会这样?

你在这里有两个问题:

  1. 您似乎以JSON.NET Parser 中描述的方式双重序列化您的dataset似乎是双重序列化我的对象 首先,您手动将返回的对象序列化为字符串,然后调用Ok(object) ,它也会序列化传入的对象(即 JSON 字符串),从而导致嵌套序列化。

    解决方案是不要这样做。 让框架通过简单地执行return Ok(dataset);为您序列化您的对象return Ok(dataset);

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

    原答案。 你的第二个问题是,你正在试图序列化DataSet使用Json.NET在.net中的核心与Json.NET 10.0.3或更早版本-不幸的是这样做目前还不支持。 问题 #1409:在 dotnet core 2.0 上将 DataSet 序列化为 JSON问题 #1383:.Net core build 不包括 DataTableConverter 中所述,此版本的 Json.NET 以 netstandard 1.3 为目标,而DataSetDataTable是在 netstandard 1.5 中引入的. 因此,此版本没有内置逻辑来序列化 .Net 核心中的这些类型。

    那么,使用此版本您有哪些选择? 首先,Json.NET 是在MIT 许可授权的,因此您可以复制其版本的DataSetConverterDataTableConverter ,将它们包含在您的项目中,并将它们添加到JsonSerializerSettings.Converters 问题JsonSerializerSettings 和 Asp.Net Core显示了如何在 ASP.NET Core 中自定义设置。

    其次,您可以将您的DataSet转换为DTO并返回它。 例如,以下扩展方法将任何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()); } }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM