问题背景

在我所开发的一个实际项目的数据库中存在着类似于以下数据:

[{"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[]

分类: 软件开发