问题背景
在我所开发的一个实际项目的数据库中存在着类似于以下数据:
[{"name":"Content Security Policy (CSP)","url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"},{"name":"Implementing Content Security Policy","url":"https://hacks.mozilla.org/2016/02/implementing-content-security-policy/"}]
从其被中括号[]
所包裹可以看出这是一个数组
,而且其中又使用大括号{}
来进行包裹,大括号中又是存在有键值对对象的内容,因此我推断这是一个对象数组[object]
。于是我尝试着建立实体对象在读取数据库时将其映射为对象数组。
解决过程
尝试方法一:
首先构造的实体类内容如下:
/// <summary>
/// 参考文献实体类
/// </summary>
public class Ckwx
{
/// <summary>
/// 参考文献名
/// </summary>
public string name { get; set; }
/// <summary>
/// 参考文献链接
/// </summary>
public string url { get; set; }
}
因此构造的数据库映射实体类中关于该内容的字段按照如下声明:
/// <summary>
/// 参考文献
/// </summary>
public List<Ckwx> ckwx { get; set; }
结果:
执行时发现其获取到的内容为空,即无法完成映射。
原因:
存储在数据库中的值为字符串形式的数据,程序无法智能的将其进行反序列化为对象列表。
尝试方法二:
将构造出来的数据库映射实体类作出修改如下:
/// <summary>
/// 参考文献
/// </summary>
public Ckwx[] ckwx { get; set; }
结果:
执行时发现其获取到的内容为空,即无法完成映射。
原因:
存储在数据库中的值为字符串形式的数据,程序无法智能的将其进行反序列化对象数组。
尝试方法三:
利用第三方反序列化工具集进行反序列化,工具集为JsonConvert
。该工具通常用来对JSON进行序列化或反序列化,但经过测试,它的功能或许还能更丰富,至少支持对象数组的反序列化。将构造出来的数据库映射实体类作出修改如下:
/// <summary>
/// 参考文献
/// </summary>
public string ckwx { get; set; }
即将值按照字符串形式从数据库中进行读取,在需要对象数组的地方利用JsonConvert
工具集进行反序列化操作,具体语句如下:
Ckwx[] ckwxes = JsonConvert.DeserializeObject<Ckwx[]>(vulnInfo.ckwx);
其中vulnInfo.ckwx
是从数据库中读取到的值。
结果:
成功进行反序列化。
总结
对于数据库的实体映射,程序暂时还没能够非常智能的进行反序列化操作,因此我们应该将数据库的值按照数据库中存储的数据类型进行读取,得到相应值之后再进行“加工”。注意区别List<object>
、object[]
。