如何使用 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 上时,您必须下载兼容版本。您可以使用标签找到要下载的最佳版本。
我们正在尝试将 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 上时,您必须下载兼容版本。您可以使用标签找到要下载的最佳版本。