代码之家  ›  专栏  ›  技术社区  ›  kongaraju

JsonConvert。数据集返回意外结果的serializeObject

  •  1
  • kongaraju  · 技术社区  · 7 年前

    我正在尝试在中将dataset转换为JSON。net core 2.0和am使用以下代码来实现这一点

    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?
    • 为什么会这样?
    2 回复  |  直到 7 年前
        1
  •  3
  •   dbc    5 年前

    这里有两个问题:

    1. 你似乎在重复你的 dataset 按照中所述的方式 JSON.NET Parser seems to be double serializing my objects . 首先手动将返回的对象序列化为字符串,然后调用 Ok(object) 哪一个 而且 序列化传入的对象(即JSON字符串),从而产生嵌套序列化。

      解决办法是不要这样做。让框架通过简单的操作为您序列化对象 return Ok(dataset);

    2. 使现代化 Json.NET 11.0 Release 1 支架。NET标准2.0,因此序列化 DataSet DataTable 现在可以在中。Net core,此版本和更高版本。您需要升级到此版本或后续版本。

      原始答案。 第二个问题是,您正在尝试序列化 数据集 使用Json。净输入。Net内核使用Json。净额 10.0.3 或者更早——不幸的是,目前还不支持这样做。如中所述 Issue #1409: serializes a DataSet to JSON on dotnet core 2.0 Issue #1383: .Net core build doesn't include DataTableConverter ,此版本的Json。NET目标netstandard 1.3,而 数据集 数据表 在netstandard 1.5中引入。因此,这个版本没有内置逻辑来序列化这些类型。净核心。

      那么,使用这个版本你有什么选择?首先,Json。NET根据 MIT License 所以你可以复制它的版本 DataSetConverter DataTableConverter ,将其包括在项目中,并将其添加到 JsonSerializerSettings.Converters . 这个问题 JsonSerializerSettings and Asp.Net Core 显示如何在ASP中自定义设置。净核心。

      其次,你可以转换你的 数据集 到a DTO 并将其返回。例如,以下扩展方法转换任何 数据集 到a Dictionary<string, List<Dictionary<string, object>>> ,可通过Json序列化。净值:

      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 不支持字典的序列化。)

        2
  •  2
  •   AlanM    7 年前

    截至2018年4月25日。我也有同样的问题。下载最新版本的Newtonsoft。我升级到11.0.2。它现在可以与ASP Core 2一起使用。数据集被转换为JSON。