Json.NET(De)序列化MailAddress

时间:2017-08-03 21:27:52

标签: c# json serialization 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; }
}

我需要序列化和反序列化以下json

{
    "id" : "abc123"
    , "firstName" : "John"
    , "email" : "john@doe.com"
}

如何将MailAddress反序列化为包含string的{​​{1}},反之亦然。

我得到的错误是:

  

无法从System.String转换或转换为   System.Net.Mail.MailAddress

2 个答案:

答案 0 :(得分:5)

Json.NET与某些.Net类型(如System.Net.IPAddressSystem.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);