C# Json.NET(反)序列化邮件地址

C# Json.NET(反)序列化邮件地址,c#,json,serialization,json.net,deserialization,C#,Json,Serialization,Json.net,Deserialization,在看了很多谷歌搜索和StackOverflow帖子后,我得出了一个结论:我可能需要创建自己的转换器。然而,这对我来说是非常非常新的,我不确定我在这些帖子中看到的例子中应该使用哪一个(如果有的话) 我有这门课,实际的课比这更复杂 public class Person { [JsonProperty(PropertyName = "id")] public string PersonId { get; set; } [JsonProperty(PropertyName =

在看了很多谷歌搜索和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反序列化为包含MailAddress.Address的字符串,反之亦然

我得到的错误是:

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


Json.NET不能很好地处理某些.NET类型,如System.NET.IPAddress或System.NET.Mail.MailAddress。除非您愿意修改JSON,否则您必须编写一个自定义转换器,以便使用以下代码:

然后,您可以按照该帖子作者的建议修改您的类:

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:

那么在你的主要发言中:


您的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);

你有什么问题?Json.NET应该闭上眼睛来做这件事。@CodingYoshi,正如您在这里看到的,它不起作用。@kiziu谢谢。ur to fast=帮我们一个忙,复制你进入问题的例外情况。为什么这会得到1票在解释范围内的否决票,2票在主题外的结束票,因为…?谢谢!也许我不擅长谷歌搜索,即使这么多年了。你知道我在搜索C Newtonsoft.Json MailAddress,但这篇文章没有出现,但将其更改为C Json.Net MailAddress,它是第四行。这看起来不错。我会试试的。我认为JsonConverter的标准方法不是检查提供的值是否对给定类型有效,而是让构造函数/解析器对其进行排序,如果不能这样做,则抛出异常。请看这里-,它没有捕获任何内容,只是运行解析。@RoLYroLLs在过去处理过IPAddress和IPEndpoint对象的此类问题后,我立即发现了错误,只需搜索C newtonsoft MailAddress转换器。谢谢,但我无法更改Json,因为它是第三方数据。准确地说,使用SalesforceAPI。
JsonConvert.DefaultSettings = () => new SerializerSettings();
{
    "id": "1",
    "firstName": "George",
    "email": {
        "DisplayName": "",
        "User": "test",
        "Host": "test.com",
        "Address": "test@test.com"
    }
}
var person = new Person
{
    PersonEmail = new System.Net.Mail.MailAddress("test@test.com"),
    PersonFirstName = "George",
    PersonId = "1"
};

var serialized = JsonConvert.SerializeObject(person);