如何使用 DataContractJsonSerializer 序列化包含日期和时间 属性 的 JSON 字符串?

How to serialize JSON string containing date and time property using DataContractJsonSerializer?

我们正在尝试将 JSON 对象 [作为字符串] 序列化为自定义 class。虽然我们不想使用任何第三方包,例如 Newtonsoft.Json 或 Json.NET,但我们尝试使用 DataContractJsonSerializer。 JSON 对象包含 "yyyy-MM-dd HH:mm:ss" 中提供的 DateTime 属性,当涉及到序列化时,会抛出以下期望。

There was an error deserializing the object of type DateTime content '2020-05-29 09:05:39' does not start with '\/Date(' and end with ')\/' as required for JSON

重要提示: 该问题将通过 NewtonSoft 软件包并将 JsonSerializerSettings 添加到 JsonConvert.DeserializeObject 来解决。由于最终产品是一个 COM 对象,我们最终的目标 dll 必须没有依赖 DLL。

您可以在下面找到技术细节:

JSON 对象是:

{
  ...,
  "export_time": "2020-05-29 09:05:39",
  "app_version": "1.1.0",
  "allowed_mac_addresses": [
    "XX-XX-XX-XX-XX-XX"
  ],
  "signature": ""
}

目标 class:

[DataContract]
public class MainFractionatorConfigFile
{
    [DataMember]
    internal string[] allowed_mac_addresses;

    [DataMember]
    internal DateTime export_time;

    [DataMember]
    internal string app_version;

    [DataMember]
    internal string signature;
}

序列化器方法是:

public static MainFractionatorConfigFile ReadMainFractionatorConfigFile(string json)
{
    var deserializedUser = new MainFractionatorConfigFile();
    var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
    var ser = new DataContractJsonSerializer(deserializedUser.GetType());
    deserializedUser = ser.ReadObject(ms) as MainFractionatorConfigFile;
    ms.Close();
    return deserializedUser;
}

尝试 1: 社区中还有一些其他建议,例如 解决方案,但他们要求参考其他包。

尝试 2 试图将 DateTimeDataContractSurrogate 添加到 DataContractJsonSerializer,但也没有成功。

综上所述,我们正在为以下代码寻找替代方法:

 var mainFObj = JsonConvert.DeserializeObject<MainFractionatorConfigFile>(myJson, new JsonSerializerSettings
                {
                    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
                });

任何帮助或想法将不胜感激。

在对添加第三方 NuGet 包有限制的情况下,为什么不尝试 clone/download 来自 Github 的包(即 Newtonsoft.JSON)并将它们直接添加到你的项目。这样您的部署(bin 文件夹)就不会有任何第三方 dll。

请注意,Newtonsoft.JSON 的最新版本是在 .netcore 中实现的,当您的项目在 .net framework 4 上时,您必须下载兼容版本。您可以使用标签找到要下载的最佳版本。