如何将Redis字符串转换为抽象类ModelBase类型并从方法返回?
问题原因
你遇到的解析错误,本质是存到Redis的是纯字符串"Hello World",但JsonConvert.DeserializeObject需要的是符合ModelBase结构的JSON对象(比如{"id":1,"name":"Hello World","email":"xxx","createdAt":"2024-01-01"}这种格式)。直接解析纯字符串,JSON序列化库会认为这不是合法的对象格式,所以报错。
另外要注意:ModelBase是抽象类,不能直接实例化,必须通过它的具体子类来返回。
解决方案
根据你的需求,分两种场景处理:
场景1:就用"Hello World"填充ModelBase的属性返回
先创建一个继承自ModelBase的具体子类(因为抽象类不能直接new):
// 示例具体子类,根据ModelBase的抽象方法/属性补充实现 public class ConcreteModel : ModelBase { // 如果ModelBase有未实现的抽象方法,在这里实现;没有的话空着即可 }
然后修改GetData方法,把Redis里的纯字符串赋值给ModelBase的对应属性(比如name),返回子类实例:
public async Task<ModelBase> GetData(string key) { var data = await this.db.StringGetAsync(key); // 实例化具体子类,给属性赋值 var resultModel = new ConcreteModel { Id = 0, // 设你需要的默认值 Name = data.ToString(), // 把Redis的纯字符串赋值给name属性 Email = null, // 或默认值 CreatedAt = DateTime.MinValue // 或默认值 }; return resultModel; }
场景2:原本应该存ModelBase的JSON(存错成纯字符串了)
如果是存储时的失误,正确的做法是先把ModelBase的子类实例序列化成JSON再存到Redis:
// 存储示例 var modelToSave = new ConcreteModel { Id = 1, Name = "Hello World", Email = "user@example.com", CreatedAt = DateTime.Now }; // 序列化成JSON字符串 var jsonData = JsonConvert.SerializeObject(modelToSave); await this.db.StringSetAsync(key, jsonData);
此时读取时就可以正常反序列化返回:
public async Task<ModelBase> GetData(string key) { var data = await this.db.StringGetAsync(key); // 反序列化成具体子类,再转成ModelBase返回 return JsonConvert.DeserializeObject<ConcreteModel>(data); }
内容的提问来源于stack exchange,提问作者HackerMan33453
相关产品推荐
相关产品推荐

