C# JSON反序列化-转换问题

C# JSON反序列化-转换问题,c#,json.net,C#,Json.net,我正在使用Newtonsoft JSON序列化(packages\Newtonsoft.JSON.11.0.2\lib\net45\Newtonsoft.JSON.dll)将字符串转换为C#中的类域。但是当我创建了一个具有Get/Set属性的域时。它没有转换 public class Account { private string _Email = string.Empty; private bool _Active = false; private DateTime

我正在使用Newtonsoft JSON序列化(packages\Newtonsoft.JSON.11.0.2\lib\net45\Newtonsoft.JSON.dll)将字符串转换为C#中的类域。但是当我创建了一个具有Get/Set属性的域时。它没有转换

 public class Account
{
    private string _Email = string.Empty;
    private bool _Active = false;
    private DateTime _CreatedDate = new DateTime();
    private IList<string> _Roles = new List<string> ();

    public string Email { get => _Email; set => value = _Email; }
    public bool Active { get => _Active; set => value = _Active; }
    public DateTime CreatedDate { get => _CreatedDate; set => value = _CreatedDate; }
    public IList<string> Roles { get => _Roles; set => value = _Roles; }
}
公共类帐户
{
私有字符串_Email=string.Empty;
私有bool _Active=false;
私有日期时间_CreatedDate=新日期时间();
私有IList_角色=新列表();
公共字符串电子邮件{get=>\u Email;set=>value=\u Email;}
public bool Active{get=>\u Active;set=>value=\u Active;}
public DateTime CreatedDate{get=>\u CreatedDate;set=>value=\u CreatedDate;}
公共IList角色{get=>\u Roles;set=>value=\u Roles;}
}
运行代码

 string json = @"{
          'Email': 'james@example.com',
          'Active': true,
          'CreatedDate': '2013-01-20T00:00:00Z',
          'Roles': [
            'User',
            'Admin'
          ]
        }";

        Account account1 = JsonConvert.DeserializeObject<Account>(json, new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All
        });
stringjson=@”{
“电子邮件”:james@example.com',
“活动”:正确,
“CreatedDate”:“2013-01-20T00:00:00Z”,
“角色”:[
“用户”,
“管理员”
]
}";
Account account1=JsonConvert.DeserializeObject


列表(角色)从字符串转换而来。但是,对于其余的列,它不会被转换。屏幕添加FYR:

它不会被转换,因为您正在使用支持字段分配
值,而它应该是颠倒的

您当前正在这样做

public string Email { get => _Email; set => value = _Email }
这是不正确的,如果您真的想使用备份字段,那么就这样做

public string Email { get => _email; set => _email = value; }
(还要注意,我将backing字段更改为Camel-Cased,这在C#中更为最新)

它使用列表的原因是,NewtonSoft看到一个列表,并简单地将项目添加到列表中(它只执行get,不执行set)

事实上,您不需要任何支持字段,只需通过“自动属性”解决它即可

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; } = new List<string>();
}
公共类帐户
{
公共字符串电子邮件{get;set;}
公共bool活动{get;set;}
公共日期时间CreatedDate{get;set;}
公共IList角色{get;}=new List();
}

它不会被转换,因为您正在使用支持字段分配
值,而它应该是颠倒的

您当前正在这样做

public string Email { get => _Email; set => value = _Email }
这是不正确的,如果您真的想使用备份字段,那么就这样做

public string Email { get => _email; set => _email = value; }
(还要注意,我将backing字段更改为Camel-Cased,这在C#中更为最新)

它使用列表的原因是,NewtonSoft看到一个列表,并简单地将项目添加到列表中(它只执行get,不执行set)

事实上,您不需要任何支持字段,只需通过“自动属性”解决它即可

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; } = new List<string>();
}
公共类帐户
{
公共字符串电子邮件{get;set;}
公共bool活动{get;set;}
公共日期时间CreatedDate{get;set;}
公共IList角色{get;}=new List();
}

顺便问一下,您是否有理由不使用自动实现的属性?如果您使用它们,您的代码可能会简单得多。(你完全可以避免这个问题。)如果你把JSON作为类粘贴到VS中,它会为你创建一个类作为旁白,你有没有理由不使用自动实现的属性?如果您使用它们,您的代码可能会简单得多。(您完全可以避免这个问题。)如果您将JSON粘贴为VS中的类,它将为您创建类