在查看了许多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; }
}
我需要序列化和反序列化以下json
{
"id" : "abc123"
, "firstName" : "John"
, "email" : "john@doe.com"
}
如何将MailAddress反序列化为包含string
的{{1}},反之亦然。
我得到的错误是:
无法从System.String转换或转换为 System.Net.Mail.MailAddress
答案 0 :(得分:5)
Json.NET与某些.Net类型(如System.Net.IPAddress
或System.Net.Mail.MailAddress
)并不相称。除非您愿意修改JSON,否则您必须编写自定义转换器才能使用它们(代码取自here):
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;
}
}
}
然后,您可以修改您的课程,因为该帖子的作者建议:
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; }
}
.. 或,您可以使用我的首选方法,即使用Json.NET' s JsonSerializerSettings
:
public sealed class SerializerSettings : JsonSerializerSettings
{
public SerializerSettings() : base()
{
this.Converters.Add(new MailAddressConverter());
}
}
然后在Main()
:
JsonConvert.DefaultSettings = () => new SerializerSettings();
答案 1 :(得分:1)
你的json结构必须是这样的,因为MailAddress
是一个对象:
{
"id": "1",
"firstName": "George",
"email": {
"DisplayName": "",
"User": "test",
"Host": "test.com",
"Address": "test@test.com"
}
}
您可以像这样进行快速测试,以查看生成的JSON:
var person = new Person
{
PersonEmail = new System.Net.Mail.MailAddress("test@test.com"),
PersonFirstName = "George",
PersonId = "1"
};
var serialized = JsonConvert.SerializeObject(person);