为 .NET Core 项目与 .NET Framework 中的 System.Data.DataTable 生成的 JSON 的变化

Posted

技术标签:

【中文标题】为 .NET Core 项目与 .NET Framework 中的 System.Data.DataTable 生成的 JSON 的变化【英文标题】:Change in JSON generated for a System.Data.DataTable in a .NET Core project vs .NET Framework 【发布时间】:2017-12-24 23:40:26 【问题描述】:

以下程序在 .NET Core 项目和 .NET Framework 应用程序中运行时会生成不同的 JSON。

代码

class Program

    internal static readonly MediaTypeFormatter DefaultFormatter = new JsonMediaTypeFormatter
    
        UseDataContractJsonSerializer = false,
        SerializerSettings =
        
            NullValueHandling = NullValueHandling.Ignore,
            DateTimeZoneHandling = DateTimeZoneHandling.Utc,
            DateFormatHandling = DateFormatHandling.IsoDateFormat
        
    ;

    private static DataTable BuildTestDataTable()
    
        var testDataTable = new DataTable();
        testDataTable.Columns.Add("Label", typeof(string));
        testDataTable.Columns.Add("Metric", typeof(decimal));
        testDataTable.Rows.Add("A", 10);
        testDataTable.Rows.Add("B", 20);
        return testDataTable;
    

    static void Main(string[] args)
    
        DataTable table = BuildTestDataTable();

        ObjectContent oc = new ObjectContent(table.GetType(), table, DefaultFormatter);

        Console.WriteLine(oc.ReadAsStringAsync().Result);

        Console.ReadKey();
    

.Net 框架:

["Label":"A","Metric":10.0,"Label":"B","Metric":20.0]

.Net 核心:


    "DataTable.RemotingVersion": 
        "_Major": 2,
        "_Minor": 0,
        "_Build": -1,
        "_Revision": -1
    ,
    "XmlSchema": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<xs:schema xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n  <xs:element name=\"Table1\">\r\n    <xs:complexType>\r\n      <xs:sequence>\r\n        <xs:element name=\"Label\" type=\"xs:string\" msdata:targetNamespace=\"\" minOccurs=\"0\" />\r\n        <xs:element name=\"Metric\" type=\"xs:decimal\" msdata:targetNamespace=\"\" minOccurs=\"0\" />\r\n      </xs:sequence>\r\n    </xs:complexType>\r\n  </xs:element>\r\n  <xs:element name=\"tmpDataSet\" msdata:IsDataSet=\"true\" msdata:MainDataTable=\"Table1\" msdata:UseCurrentLocale=\"true\">\r\n    <xs:complexType>\r\n      <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\" />\r\n    </xs:complexType>\r\n  </xs:element>\r\n</xs:schema>",
    "XmlDiffGram": "<diffgr:diffgram xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\" xmlns:diffgr=\"urn:schemas-microsoft-com:xml-diffgram-v1\">\r\n  <tmpDataSet>\r\n    <Table1 diffgr:id=\"Table11\" msdata:rowOrder=\"0\" diffgr:hasChanges=\"inserted\">\r\n      <Label>A</Label>\r\n      <Metric>10</Metric>\r\n    </Table1>\r\n    <Table1 diffgr:id=\"Table12\" msdata:rowOrder=\"1\" diffgr:hasChanges=\"inserted\">\r\n      <Label>B</Label>\r\n      <Metric>20</Metric>\r\n    </Table1>\r\n  </tmpDataSet>\r\n</diffgr:diffgram>"

有人能告诉我造成这种情况的原因吗,这是否是故意的差异?

【问题讨论】:

为什么还要使用 DataTable?为什么不传递强类型对象? “DataTable.RemotingVersion”序言看起来像是来自 DataTable 的 ISerializable github.com/Microsoft/referencesource/blob/master/System.Data/… 实现,但不确定为什么在 .NET Core 上调用它(而不是使用 JSON 序列化程序) 我猜 .net fx JsonMediaTypeFormatter 有一个特殊的 JsonConverter 用于 DataTable 而 .net 核心没有,这就是为什么 .net 核心使用来自 ISerialization 实现的信息 JsonMediaTypeFormatter 在内部使用 Json.Net 进行序列化,而 Json.Net 有一个 DataTableConverter 似乎只对 .net Framework DataTable 有效 是的 - DataTableConverter 类型甚至在 Newtonsoft.Json 的 .net 核心版本中都不可用。 . . 【参考方案1】:

根据https://github.com/JamesNK/Newtonsoft.Json/issues/1383

在 netstandard1.5 中,但 netstandard1.3 是 Json.NET 支持的最高版本。当最终添加 netstandard2.0 构建时,我将添加对它的支持。

【讨论】:

也许再长一点github.com/JamesNK/Newtonsoft.Json/issues/1383 他们现在已经修好了。

以上是关于为 .NET Core 项目与 .NET Framework 中的 System.Data.DataTable 生成的 JSON 的变化的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 项目类型,用于与多个项目共享布局

.NET Core/.NET5/.NET6 开源项目汇总3:工作流组件

.Net Core 2.0 appsettings 与 .net 完整框架使用 ConfigurationManager

net core体系-API-1Ocelot-项目实战

.NET Core爱gRPC

[Asp.Net Core]Asp.Net Core与配置系统的集成