我们正在尝试将 JSON 对象[作为字符串]序列化为自定义类。虽然我们不想使用任何第三方包,例如 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": ""
}
目标类别:
[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:社区中还有一些其他建议,例如 this解决方案,但他们要求引用其他包。
尝试 2 尝试将 DateTimeDataContractSurrogate 添加到 DataContractJsonSerializer,但也没有成功。
总而言之,我们正在寻找以下代码的替代方法:
var mainFObj = JsonConvert.DeserializeObject<MainFractionatorConfigFile>(myJson, new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
});
任何帮助或想法将不胜感激。
最佳答案
如果在添加第三方 NuGet 包方面存在限制,为什么不尝试从 Github 克隆/下载包(即 Newtonsoft.JSON)并将其直接添加到您的项目中。这样您的部署中就不会有任何第三方 dll(bin 文件夹)。
请注意,最新版本的 Newtonsoft.JSON 是在 .netcore 中实现的,当您的项目位于 .net Framework 4 上时,您必须下载兼容版本。您可以使用标签找到要下载的最佳版本。
关于c# - 如何使用 DataContractJsonSerializer 序列化包含日期和时间属性的 JSON 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62141515/