json - 如何将此嵌套 JSON 转换为 Datatable
问题描述
[{
"change": {
"action": "updated",
"record_id": 71176961,
"record": {
"time_entry": {
"date_at": "2019-04-04",
"minutes": 197
}
}
}
}, {
"change": {
"action": "created",
"record_id": 71209354,
"record": {
"time_entry": {
"date_at": "2019-04-04",
"minutes": 15
}
}
}
}]
我需要将其转换json
为,2D powershell data table
以便将bulkcopy
其转换为database table
. 所以我在 json 中有 2 个级别(3D)(更改和记录更改)。我可以做类似的事情(从json转换后):
.change | Select-Object action, record_id, @{n='date_at';e={$_.record.time_entry.date_at}}, @{n='minutes';e={$_.record.time_entry.minutes}}| Out-DataTable
但问题是,记录实体可能非常大(并且会增长),我不想在代码中指定所有名称。所以我想将第二级(记录)转换为数据表,并在代码中有change.action、change.record_id(因为“change”结构永远不会改变,但“record”会)。
解决方案
这对我有用:
$object = @"
[{
"change": {
"action": "updated",
"record_id": 71176961,
"record": {
"time_entry": {
"date_at": "2019-04-04",
"minutes": 197
}
}
}
}, {
"change": {
"action": "created",
"record_id": 71209354,
"record": {
"time_entry": {
"date_at": "2019-04-04",
"minutes": 15
}
}
}
}]
"@ | ConvertFrom-Json
#------------------------------------------------------------------------
function Get-DataTable
#------------------------------------------------------------------------
{
param(
[PSCustomObject]$srcObject,
[System.Data.DataTable]$dt,
[System.Data.DataRow]$row = $null
)
foreach( $property in $srcObject.PSObject.Properties ) {
if( $property.Value -is [PSCustomObject] ) {
$row = (Get-DataTable -srcObject $property.Value -dt $dt -row $row).Row
}
else {
if( $row -eq $null ) {
if( $dt.Columns.IndexOf($property.Name) -lt 0 ) {
[void]$dt.Columns.Add($property.Name, [string]::Empty.GetType() )
}
}
else {
$row.Item($property.Name) = $property.value
}
}
}
return @{ 'Row' = $row }
}
$dt = New-Object System.Data.DataTable
# create columns
foreach( $item in $object ) {
Get-DataTable -srcObject $item -dt $dt | out-null
}
# fill datatable
foreach( $item in $object ) {
$row = $dt.NewRow()
$row = (Get-DataTable -srcObject $item -dt $dt -row $row).Row
[void]$dt.Rows.Add( $row )
}
$dt
推荐阅读
- visual-c++ - 无法从函数内的数组中提取信息以打印直方图(C++)
- javascript - 比较两个对象以创建一个新对象
- r - 使用正则表达式在R中提取括号中的数字
- python - 无法对 deepLabv3+ 推理进行 MeanIOU 或混淆矩阵
- cmake - CMake 错误:安装 TARGETS 给定目标“Foo::Foo”,这是一个别名
- python - Tensorflow Keras 顺序与功能不一致
- android - MutableLiveData 未更新
- java - 有没有更简单的方法来检查 if 语句中的多个变量
- excel - 如何使用 vb 6.0 将 ms 访问数据导出到带有模板的 excel?
- ios - 自定义 UIInputView 应该是单例吗?