JSON反序列化为具有私有setter的对象
我遇到了JSON和反序列化的问题。 我有一个实时生产代码,它使用消息对象将信息从一个系统传递到另一个系统。 消息的ID非常重要,因为它用于识别它。 我们也不希望任何人设置ID,因此使其成为私人安装者。
尝试反序列化JSON对象并且未设置ID时出现问题。 (显然因为它是私人的)
有没有人有一个好的建议作为最佳的进行方式? 我尝试过使用Iserialisation,但它被忽略了。 我尝试过使用DataContract,但由于我们从外部系统获取数据,因此失败了。
目前我唯一的选择是让ID和TimeCreated字段具有公共设置器。
我有一个这样的对象
Message { public Message() { ID = Guid.NewGuid(); TimeCreated = DateTime.Now(); } Guid ID { get; private set; } DateTime TimeCreated { get; private set; } String Content {get; set;} }
现在我使用以下代码:
var message = new Message() { Content = "hi" }; JavaScriptSerializer jss = new JavaScriptSerializer(); var msg = jss.Serialize(message); var msg2 = jss.Deserialize(msg); Assert.IsNotNull(msg2); Assert.AreEqual(message.ID, msg2.ID);
Id和Time创建的字段不匹配,因为它们是私有的。 我也试过内部和保护,但也没有喜悦。
完整对象有一个构造函数,它接受一个ID和Date时间来设置它们从DB加载它们。
任何帮助将不胜感激。
谢谢
您可以使用DataContractJsonSerializer
而不是JavaScriptSerializer
。 您需要使用一些数据协定属性来装饰您的类。
[DataContractAttribute()] public class Message { public Message() { ID = Guid.NewGuid(); TimeCreated = DateTime.Now; } [DataMemberAttribute()] Guid ID { get; private set; } [DataMemberAttribute()] DateTime TimeCreated { get; private set; } [DataMemberAttribute()] String Content {get; set;} }
通用序列化辅助方法
public static string ToJsonString(object obj) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, obj); StringBuilder sb = new StringBuilder(); sb.Append(Encoding.UTF8.GetString(ms.ToArray())); return sb.ToString(); } } public static T ToObjectFromJson(string json) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) { return (T) serializer.ReadObject(ms); } }
在您的情况下,您可以使用以下命令反序列化:
Message msg = ToObjectFromJson(jsonString);
我认为在你的json和你的Dto之间有一个新的抽象层是你最好的选择。
上述就是C#学习教程:JSON反序列化为具有私有setter的对象分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
MessageViewModel { public MessageViewModel() { } Guid ID { get; set; } DateTime TimeCreated { get; set; } String Content {get; set;} } static MessageFactory { public static Message Build(MessageViewModel viewModel) { var result = new Message(viewModel.ID, viewModel.TimeCreated); result.Content .... etc etc return result; } } JavaScriptSerializer jss = new JavaScriptSerializer(); MessageViewModel viewModel = jss.Deserialize(jsonString); var message = MessageFactory.Build(viewModel);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/983607.html