RoL*_*LLs 0 c# serialization json json.net deserialization
在查看了许多Google搜索和StackOverflow帖子后,我得出的结论是我可能会创建自己的转换器。但是,这对我来说是非常非常新的东西,我不确定我可以使用这些帖子中的哪些示例(如果有)。
我有这节课(实际课比这更复杂)
public class Person {
[JsonProperty(PropertyName = "id")]
public string PersonId { get; set; }
[JsonProperty(PropertyName = "firstName")]
public string PersonFirstName { get; set; }
[JsonProperty(PropertyName = "email")]
public MailAddress PersonEmail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要序列化和反序列化以下json
{
"id" : "abc123"
, "firstName" : "John"
, "email" : "john@doe.com"
}
Run Code Online (Sandbox Code Playgroud)
如何将MailAddress反序列化为string包含内容MailAddress.Address,反之亦然。
我得到的错误是:
无法将System.String强制转换或转换为System.Net.Mail.MailAddress
Json.NET在某些.Net类型(例如System.Net.IPAddress或)中不能很好地发挥作用System.Net.Mail.MailAddress。除非您愿意修改JSON,否则必须编写一个自定义转换器才能使用它们(代码从此处获取):
public class MailAddressConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var mailAddress = value as MailAddress;
writer.WriteValue(mailAddress == null? string.Empty : mailAddress.ToString());
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var text = reader.Value as string;
MailAddress mailAddress;
return IsValidMailAddress(text, out mailAddress) ? mailAddress : null;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(MailAddress);
}
private static bool IsValidMailAddress(string text, out MailAddress value)
{
try
{
value = new MailAddress(text);
return true;
}
catch
{
value = null;
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以按照该帖子的作者的建议修改您的课程:
public class Person
{
[JsonProperty(PropertyName = "id")]
public string PersonId { get; set; }
[JsonProperty(PropertyName = "firstName")]
public string PersonFirstName { get; set; }
[JsonConverter(typeof(MailAddressConverter))]
[JsonProperty(PropertyName = "email")]
public MailAddress PersonEmail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
.. 或,您可以使用我的首选方法,即使用Json.NET的方法JsonSerializerSettings:
public sealed class SerializerSettings : JsonSerializerSettings
{
public SerializerSettings() : base()
{
this.Converters.Add(new MailAddressConverter());
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的Main():
JsonConvert.DefaultSettings = () => new SerializerSettings();
Run Code Online (Sandbox Code Playgroud)