反序列化 json 中的私有集设置不正确

private set in deserialize json doens't set correctly

如您所见,我有这个 class :

public class UserScope
    {
        public List<Guid> testCenterIds { get; private set; }
        public List<Guid> roleIds { get; private set; }
        public List<int> townCodes { get; private set; }
        public List<int> CityCodes { get; private set; }
        public List<int> provinceCodes { get; private set; }
        public List<string> provinceCodes2 { get; private set; }

        public UserScope(List<Guid> testCenterIds, List<Guid> roleIds, List<int> townIds, List<int> cityIds, List<int> provinceIds, List<string> provinceIds2)
        {
            this.testCenterIds = testCenterIds;
            this.roleIds = roleIds;
            this.townCodes = townIds;
            this.CityCodes = cityIds;
            this.provinceCodes = provinceIds;
            this.provinceCodes2 = provinceIds2;
        }
    }

当我想将我的 json 转换为模型时,如您所见:

  static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var uc = new UserScope(
   new List<Guid> { Guid.NewGuid(), Guid.NewGuid() },
      new List<Guid> { Guid.NewGuid(), Guid.NewGuid() },
      new List<int> { 12126 },
      new List<int> { 12122 },
      new List<int> { 12312, 13479 }, new List<string> { "12312", "13479" }

  );
        var jsons = Newtonsoft.Json.JsonConvert.SerializeObject(uc);

        var jsond = Newtonsoft.Json.JsonConvert.DeserializeObject<UserScope>(jsons);
    }

JsonConvert 无法转换 townCodes ,CityCodes,provinceCodes ,provinceCodes2 并初始化它们,最终 townCodes ,CityCodes,provinceCodes ,provinceCodes2 是 null.But testCenterIds,roleIds 工作 fine.why?

您的 UserScope 只有一个构造函数接受某些参数(没有不带参数的默认构造函数),并且没有属性标记为 JsonProperty,因此 JSON.NET 假设它需要调用该构造函数来创建一个实例。然后它将 json 字符串中的键与该构造函数的参数名称进行匹配。 testCenterIdsroleIds 名称与所述键匹配,而其他参数名称不匹配,因此 JSON.NET 将空值传递到那里。如果像这样重命名构造函数参数:

public UserScope(List<Guid> testCenterIds, List<Guid> roleIds, List<int> townCodes, List<int> cityCodes, List<int> provinceCodes, List<string> provinceCodes2)
{
    this.testCenterIds = testCenterIds;
    this.roleIds = roleIds;
    this.townCodes = townCodes;
    this.CityCodes = cityCodes;
    this.provinceCodes = provinceCodes;
    this.provinceCodes2 = provinceCodes2;
}

然后它们都会被填充。或者,您可以使用 JsonProperty 属性标记所有属性(最好在可能和合适的情况下始终这样做),如评论中链接的答案中所述。