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?
- 为什么会这样显示?
你这里有两个问题:
您似乎正在按照 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);
让框架为您序列化您的对象
Update. Json.NET 11.0 Release 1 支持 .NET Standard 2.0,因此现在可以对 DataSet
和 DataTable
进行序列化在 .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 为目标,而 DataSet
和 DataTable
是在 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。
我正在尝试将数据集转换为 .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?
- 为什么会这样显示?
你这里有两个问题:
您似乎正在按照 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);
让框架为您序列化您的对象
Update. Json.NET 11.0 Release 1 支持 .NET Standard 2.0,因此现在可以对
DataSet
和DataTable
进行序列化在 .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 为目标,而DataSet
和DataTable
是在 netstandard 1.5 中引入的。因此,此版本没有在 .Net 核心中序列化这些类型的内置逻辑。那么,您使用这个版本有哪些选择?首先,Json.NET 是根据 MIT License so you could copy its versions of
DataSetConverter
andDataTableConverter
, include them in your project, and add them toJsonSerializerSettings.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。