我正在使用Newtonsoft JSON Serialization(packages \ Newtonsoft.Json.11.0.2 \ lib \ net45 \ Newtonsoft.Json.dll)将字符串转换为C#中的Class Domain。但是当我创建一个具有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; }
}
运行代码,
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
});
结果:
列表(角色)是从字符串转换而来的。但是,剩余的列,它不会被转换。屏幕添加FYR:
答案 0 :(得分:3)
它没有被转换,因为您正在为value
分配您的支持字段,而它应该是颠倒的。
您目前正在这样做
public string Email { get => _Email; set => value = _Email }
这是不正确的,如果你真的想使用支持字段,那么就像
一样public string Email { get => _email; set => _email = value; }
(另请注意,我将支持字段更改为Camel Cased,它在C#中更新为coding conventions)
它与列表一起使用的原因是,NewtonSoft看到了一个列表,只是将这些项添加到列表中(它只是一个get,但没有设置)
实际上,您不需要任何支持字段,只需通过自动属性
即可解决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>();
}