PowerShell将DB2 DataTable结果转为适配jQuery DataTables的JSON文件
根因定位
- 结构不匹配:序列化时未按jQuery DataTables的要求嵌套
data父节点,直接输出了纯行数组。 - 序列化异常来源:
- 集合内混装了DataTable整体对象、无结构的空行,非强类型集合触发了PowerShell序列化的隐式类型转换
- 未指定
ConvertTo-Json的序列化深度,默认深度为2时,超出层级的对象会被直接转为字符串形式的@{...}哈希表表示,也就是看到的错误输出 - 原查询返回逻辑未逐行展开DataTable,直接传整个表对象进入管道,属性筛选未作用到行级别
原实现存在过度设计:无需把DataTable、空行作为独立对象堆入ArrayList,统一存储行级纯对象即可满足需求。
修正实现代码
调整DB2查询函数
逐行返回排除冗余属性的纯对象,不输出整体DataTable:
Function Get-DB2Results { param ($db2) $script:dbcmd.CommandText = $db2 $rdr = $script:dbcmd.ExecuteReader() $dt = [System.Data.DataTable]::New() $dt.Load($rdr) # 逐行筛选属性,避免传入整体DataTable对象 foreach ($row in $dt.Rows) { $row | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors } $rdr.Close() }
定义统一结构的空行
确保空行和数据行的列结构完全一致,不使用无结构的空值:
$blankLine = [PSCustomObject]@{ A = "" B = "" C = "" D = "" }
导出流程优化
用强类型列表存储行对象,嵌套data节点,指定足够的序列化深度:
Connect-DB2 # 用强类型PSObject列表替代ArrayList,避免混装类型异常 $allRows = [System.Collections.Generic.List[PSObject]]::New() foreach ($query in $SQLArray) { # 批量添加当前查询返回的所有行 $allRows.AddRange([PSObject[]](Get-DB2Results -db2 $query)) # 插入结构一致的空行 $allRows.Add($blankLine) } Disconnect-DB2 # 按DataTables要求结构嵌套,指定10层序列化深度避免截断 @{ data = $allRows.ToArray() } | ConvertTo-Json -Depth 10 | Out-File \\SRV01\Data\totalsArray.txt -Force
修正后效果
- 输出JSON结构完全匹配jQuery DataTables要求的顶层
data数组格式,组件可直接读取渲染 - 不会出现
@{...}形式的字符串序列化错误,所有条目均为标准JSON对象 - 无冗余的DataTable属性被序列化进输出文件
内容的提问来源于stack exchange,提问作者Mike W
相关产品推荐
相关产品推荐

