反序列化 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 字符串中的键与该构造函数的参数名称进行匹配。 testCenterIds
和 roleIds
名称与所述键匹配,而其他参数名称不匹配,因此 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
属性标记所有属性(最好在可能和合适的情况下始终这样做),如评论中链接的答案中所述。
如您所见,我有这个 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 字符串中的键与该构造函数的参数名称进行匹配。 testCenterIds
和 roleIds
名称与所述键匹配,而其他参数名称不匹配,因此 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
属性标记所有属性(最好在可能和合适的情况下始终这样做),如评论中链接的答案中所述。