【问题标题】:POWERSHELL - JSON - outputing parent and child nodes togetherPOWERSHELL - JSON - 一起输出父节点和子节点
【发布时间】:2022-01-01 09:21:24
【问题描述】:

开始学习 PS 并被困在如何使用 Select-Object 和 Calculated Properties 上。你能帮忙吗?

给定 以下结构的嵌套 JSON 文件:

{
    "asn": "111",
    "cartons": [
        {
            "carton": "00300000000000000001",
            "items": [
                {
                    "gtin": "04000000000001",
                    "serials": [
                        {
                            "serial": "gQ6;66/Iokpa0"
                        },
                        {
                            "serial": "1JFgKK,ImIwH\""
                        },
                        {
                            "serial": "feDiSStPwQSr3"
                        }
                    ]
                }
            ]
        },
        {
            "carton": "00300000000000000002",
            "items": [
                {
                    "gtin": "04000000000002",
                    "serials": [
                        {
                            "serial": "bMG-u2jCc4LfM"
                        },
                        {
                            "serial": "KEOHZ6enUPT)6"
                        }
                    ]
                }
            ]
        },
        {
            "carton": "00300000000000000003",
            "items": [
                {
                    "gtin": "04000000000003",
                    "serials": [
                        {
                            "serial": "344r,I1n3o:Gn"
                        },
                        {
                            "serial": "N:NYiBXGYCQl("
                        }
                    ]
                }
            ]
        }
    ]
}

问题一如何输出列表:

GTIN              SERIAL
----              ------
04000000000001    gQ6;66/Iokpa0
04000000000001    1JFgKK,ImIwH"
04000000000001    feDiSStPwQSr3
04000000000002    bMG-u2jCc4LfM
04000000000002    KEOHZ6enUPT)6
04000000000003    344r,I1n3o:Gn
04000000000003    N:NYiBXGYCQl(

问题2如何输出列表:

CARTON                  GTIN              SERIAL
------                  ------            ------
00300000000000000001    04000000000001    gQ6;66/Iokpa0
00300000000000000001    04000000000001    1JFgKK,ImIwH"
00300000000000000001    04000000000001    feDiSStPwQSr3
00300000000000000002    04000000000002    bMG-u2jCc4LfM
00300000000000000002    04000000000002    KEOHZ6enUPT)6
00300000000000000003    04000000000003    344r,I1n3o:Gn
00300000000000000003    04000000000003    N:NYiBXGYCQl(

问题 3 如何通过附加插入输出 PARENT 和 CHILD 节点的串联:

GTIN+SERIAL
------------
(01)04000000000001(21)gQ6;66/Iokpa0
(01)04000000000001(21)1JFgKK,ImIwH"
(01)04000000000001(21)feDiSStPwQSr3
(01)04000000000002(21)bMG-u2jCc4LfM
(01)04000000000002(21)KEOHZ6enUPT)6
(01)04000000000003(21)344r,I1n3o:Gn
(01)04000000000003(21)N:NYiBXGYCQl(

我的尝试

首先,我和-expandProperty一起玩

$asn = convertFrom-Json -inputObject $j #actually, in the full code don't need this conversion, use Invoke-RestMethod
$asn.cartons.items | select-object -property gtin -expandProperty serials

然后尝试采用powershell json print parent and childrenhow to combine properties from objects and their "parent" object?的代码,但没有成功。

然后通过 about_Calculated_Properties - 再次只是简单的示例。

然后:

$asn = convertFrom-Json -inputObject $j
$asn.cartons.items | ForEach-Object {
$gtin = $_.gtin 
$serials = $_.serials | ForEach-Object {
        [pscustomobject] @{
            'gtin' = $gtin
            'serial' = $_.serial
        }
    }
}

【问题讨论】:

  • 您是否尝试过自己编写任何代码来执行此操作?在此处发帖时,您通常会被问到这个问题。尝试发布您的尝试。
  • 至少尝试一下,如果您遇到困难,我们可以为您提供帮助。
  • 添加了我的尝试。

标签: json powershell


【解决方案1】:

我不会给你一个直接的答案,而是一些指导(主要是因为这看起来真的像一些测试题)。但是:

当您调用select-object(为简洁起见,我将只使用select)时,您可以选择执行“计算属性”。为此,您需要 2 件事:
namen 用于定义属性的实际值
expressione,一个脚本块使用方式与foreach-objectwhere-object 相同。

我还可以看到,您想要的所有结果都依赖于循环遍历数组cartons,因此我们将使用它作为循环:

$Othervalue = "some other value"
Foreach($carton in $json.cartons)
{
    $carton|select @{n='gtin';e={$_.items.gtin}},@{n='othervalue';e={$othervalue}}
}

这里发生的是我从当前对象$carton 中选择属性项,然后是gtin
powershell 真的不在乎 items 对象是一个数组。如果它发现items 数组中的一项具有名为gtin 的属性,它将返回该值。如果它找到了几个,那么它将返回一个由gtin 值组成的数组。如何处理这取决于您,但从您的示例中只有一个 gtin 属性。您会很快注意到这一点,然后您尝试检索序列值。

othervalue 只是为了表明您还可以显示“仅此项目”范围之外的值。

现在,如果您想让它为 itemsserial 中的每个项目输出值,您可能必须在 foreach 中的 foreach 中执行类似 foreach 之类的操作,这很快就会变得混乱,所以我的建议是使用foreach($item in $items) 而不是$items|foreach{},只是为了让使用的变量尽可能详细。

【讨论】:

  • @mklement0 你是对的,我的错。现在修复了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多