我正在尝试从REST服务反序列化JSON。我将JSON反序列化为结构。该结构包含公共属性。我想隐藏基本的string
/ int
对象,并为每个值使用正确的对象。在这样做时,我隐藏了原始属性,并希望找到一种方法来填充它们尽管如此。我在stackoverflow上找到了relevant answer。问题是在反序列化期间私有属性实际上没有被赋予任何值。
然后我尝试创建自己的ContractResolver
。我找到了CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
的以下代码。
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable)
{
var property = member as PropertyInfo;
if (property != null)
{
var hasPrivateSetter = property.GetSetMethod(true) != null;
prop.Writable = hasPrivateSetter;
}
}
return prop;
这仍然不会分配给完全私有的属性。我不知道如何从这里开始,因为我能够找到的所有解决方案都使用这两种解决方案的变体。我该怎么办?
修改
我创建了一个展示我的问题的小例子。 https://gist.github.com/Herbstein/9ea14e2a4d95dd5aa4430384bfeeedf3
答案 0 :(得分:2)
它不足以处理私人制定者,你必须允许该物业本身是私人的:
internal class PrivateResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(
Type type, MemberSerialization memberSerialization
) {
return type
.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic)
.Select(p => CreateProperty(p, memberSerialization))
.ToList();
}
protected override JsonProperty CreateProperty(
MemberInfo member, MemberSerialization memberSerialization
) {
var prop = base.CreateProperty(member, memberSerialization);
if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) {
prop.Writable = true;
}
return prop;
}
}
如果我没有提及AutoMapper作为这类问题的更通用的解决方案,那么我会失职。这要求您声明更多的类,但也要使类型本身更简单。