c# - 是否可以反序列化为属性而不是对象
问题描述
如果它已经被问过,我找不到任何对我的情况有帮助的东西。
我需要反序列化对象属性中的 JSON,而不是整个对象。我尝试这样做的原因是,这只是泛型。
我有以下情况
例如我有
Class User
{
int UserId {get;set;}
string Name {get;set;
}
Class Wanted : CustomClass
{
User[] Users {get;set;}
public override void Map(){ }
public override void Scan(){ }
}
我的Json是:
[
{
"userId": 1,
"name": "Josh"
},
{
"userId": 5,
"name" : "Martin"
}
]
是否可以将我的 JSON 直接反序列化(+泛型)到我的 Wanted 类中,而不是序列化为 A 然后将其分配给 Wanted ?
目标是在序列化之后,我将拥有 Wanted 类型的对象和一个包含 2 个用户的数组。
解决方案
由于 JSON 与您要反序列化的类不匹配,并且您无法更改 JSON,因此您需要使用自定义JsonConverter
来弥补差距。
为了使它工作,你需要引入一个IHasUsers
你的Wanted
类(或其基类)需要实现的接口:
interface IHasUsers
{
User[] Users { get; set; }
}
class Wanted : CustomClass, IHasUsers
{
public User[] Users { get; set; }
...
}
然后你可以制作一个通用转换器,它将实例化Wanted
类(或任何其他实现的类IHasUsers
)并填充Users
属性:
class UserListConverter<T> : JsonConverter where T: IHasUsers, new()
{
public override bool CanConvert(Type objectType)
{
return typeof(IHasUsers).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
T obj = new T() { Users = array.ToObject<User[]>() };
return obj;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后你可以像这样反序列化你的 JSON:
Wanted wanted = JsonConvert.DeserializeObject<Wanted>(json, new UserListConverter<Wanted>());
这是一个演示: https ://dotnetfiddle.net/KL6Ok6
希望这就是你要找的。
推荐阅读
- gradle - Gradle 将多个目录的内容复制到一个目录中
- python - 有没有办法监控导致程序在linux中关闭python脚本的原因?
- asp.net - 从文件夹中删除图像时出现错误
- php - Laravel:验证大于零的数字失败
- azure-service-fabric - 从外部阻止 Service Fabric 服务关闭
- c++ - 如何使用 PPM 缩放 Box2D 对象?
- javascript - MomentJS 仅显示加载时间
- jquery - Krajee Bootstrap 文件输入:使用表单发送文件
- ios - 使用 swift 创建 JSON
- javascript - 在用户上传reactjs时获取mp4的尺寸