【问题标题】:JSON Deserialize - Conversion IssueJSON 反序列化 - 转换问题
【发布时间】:2018-04-02 00:12:36
【问题描述】:

我正在使用 Newtonsoft JSON Serialization(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; }
}

运行代码,

 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:

【问题讨论】:

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

标签: c# json.net


【解决方案1】:

它没有被转换,因为您将 value 与您的支持字段一起分配,而它应该是颠倒的。

你目前正在这样做

public string Email { get => _Email; set => value = _Email }

这是不正确的,如果你真的想使用支持字段,那么就这样做

public string Email { get => _email; set => _email = value; }

(另请注意,我将支持字段更改为 Camel Cased,在 C# 中使用 coding conventions 更新)

它与列表一起使用的原因是 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>();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多