簡體   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