Powershell Convert-ToJson - 动态添加内容

时间:2017-11-22 21:31:29

标签: json powershell variables

我有一段代码(向Microsoft团队发送消息的脚本的一部分),它将一些JSON存储在一个变量中:

$body = ConvertTo-Json @{
    title    = "$($messageTitle)"
    text     = " "
    sections = @(
        @{
            activityTitle    = "$($activityTitle)"
            activitySubtitle = " "
            activityImage    = "$imageLink"
        },
        @{
            title          = 'Details'
            facts          = @(
                @{
                    name  = 'Name1'
                    value = ''
                })
            potentialAction = @(@{
                    '@context' = 'http://schema.org'
                    '@type'    = 'ViewAction'
                    name       = 'Button Name'
                    target   = @("https://google.com.au")
                }                   
            )
        }
    )

}

生成此代码时,“事实”部分中的“事实”数量未知。我想使用变量动态地将X个名称/值对添加到此区域中,例如:

facts          = @(
            $facts                  
            })

在该变量中有多个名称/值对:

@{name='name1',value='value1'},@{name='name2',value='value2'},@{name='name3',value='value3'}

然而,我正在努力使用格式化,到目前为止我没有尝试过,没有引号等组合起作用,结果总是无效的JSON代码。

任何人都可以让我了解将这些值插入代码的最佳方法吗?

我的最新迭代是在插入之前尝试将插入的变量$ facts转换为JSON:

$facts = convertto-json @(
    @{
        name  = 'name1'
        value = 'value1'
    },
    @{
        name  = 'name2'
        value = 'value2'
    },
    @{
        name  = 'name3'
        value = 'value3'
    }
)

$body = ConvertTo-Json @{
    title    = "$($messageTitle)"
    text     = " "
    sections = @(
        @{
            activityTitle    = "$($activityTitle)"
            activitySubtitle = " "
            activityImage    = "$imageLink"
        },
        @{
            title          = 'Details'
            facts          = @(
                    $facts
                )
            potentialAction = @(@{
                    '@context' = 'http://schema.org'
                    '@type'    = 'ViewAction'
                    name       = 'Button Name'
                    target   = @("https://google.com.au")
                }                   
            )
        }
    )

但是结果失败了,似乎无论我做什么,都会在变量中添加额外的字符:

{
"title":  "Test Title",
"sections":  [
                 {
                     "activitySubtitle":  " ",
                     "activityImage":  "http://icons.iconarchive.com/icons/double-j-design/origami-colored-pencil/128/green-ok-icon.png",
                     "activityTitle":  "test Activity"
                 },
                 {
                     "facts":  "[\r\n    {\r\n        \"value\":  \"value1\",\r\n        \"name\":  \"name1\"\r\n    },\r\n    {\r\n        \"value\":  \"value2\",\r\n        \"name\":  \"name2\"\r\n    },\r\n    {\r\n        \"value\":  \"value3\",\r\n        \"name\":  \"name3\"\r\n    }\r\n]",
                     "title":  "Details",
                     "potentialAction":  "System.Collections.Hashtable"
                 }
             ],
"text":  " "

}

非常感谢任何帮助!

编辑:

作为第二个例子(第一个例子很可怕),这是试图将它用作普通字符串:

$facts = '@(
    @{
        name  = "name1"
        value = "value1"
    },
    @{
        name  = "name2"
        value = "value2"
    },
    @{
        name  = "name3"
        value = "value3"
    }
)'

$body = ConvertTo-Json @{
    title    = "$($messageTitle)"
    text     = " "
    sections = @(
        @{
            activityTitle    = "$($activityTitle)"
            activitySubtitle = " "
            activityImage    = "$imageLink"
        },
        @{
            title          = 'Details'
            facts          = $facts
            potentialAction = @(@{
                    '@context' = 'http://schema.org'
                    '@type'    = 'ViewAction'
                    name       = 'Button Name'
                    target   = @("https://google.com.au")
                }                   
            )
        }
    )

其输出相同,错误的JSON有效负载。

实际的JSON输出是如此格式化:

"facts":  "@(\r\n\t\t@{\r\n\t\t\tname  = \"name1\"\r\n\t\t\tvalue = \"value1\"\r\n\t\t},\r\n\t\t@{\r\n\t\t\tname  = \"name2\"\r\n\t\t\tvalue = \"value2\"\r\n\t\t},\r\n\t\t@{\r\n\t\t\tname  = \"name3\"\r\n\t\t\tvalue = \"value3\"\r\n\t\t}\r\n\t)",

我显然没有使用正确的格式化技术组合。

“事实”部分的示例:

facts = @(
            @{
            name = 'Current State'
            value = $($status)
            },
            @{
            name = 'Message'
            value = $($message)
            },
            @{
            name = 'Since'
            value =$($since)
            },
            @{
            name = 'Last up'
            value = $($lastup)
            },
            @{
            name = 'Sensor'
            value = $($sensorURL)
            },
            @{
            name = 'Device'
            value = $($deviceURL)
            },
            @{
            name = 'Management URL'
            value = $($serviceURL)
            }
        )

1 个答案:

答案 0 :(得分:3)

不要将$ facts转换为JSON,将其保留为哈希表数组,

$facts = @(
    @{
        name  = 'name1'
        value = 'value1'
    },
    @{
        name  = 'name2'
        value = 'value2'
    },
    @{
        name  = 'name3'
        value = 'value3'
    }
)

然后务必为转换设置-Depth,

$body = ConvertTo-Json @{
    title    = "$($messageTitle)"
    text     = " "
    sections = @(
        @{
            activityTitle    = "$($activityTitle)"
            activitySubtitle = " "
            activityImage    = "$imageLink"
        },
        @{
            title          = 'Details'
            facts          = $facts
            potentialAction = @(@{
                    '@context' = 'http://schema.org'
                    '@type'    = 'ViewAction'
                    name       = 'Button Name'
                    target   = @("https://google.com.au")
                }                   
            )
        }
    )
} -Depth 5

我随意挑选了5个,对这样的小任务进行过度评估并没有什么坏处,我确信这已经足够了。

$body > test.json

给我们这样的东西......?

{
    "title":  "",
    "sections":  [
                     {
                         "activitySubtitle":  " ",
                         "activityImage":  "",
                         "activityTitle":  ""
                     },
                     {
                         "facts":  [
                                       {
                                           "value":  "value1",
                                           "name":  "name1"
                                       },
                                       {
                                           "value":  "value2",
                                           "name":  "name2"
                                       },
                                       {
                                           "value":  "value3",
                                           "name":  "name3"
                                       }
                                   ],
                         "title":  "Details",
                         "potentialAction":  [
                                                 {
                                                     "@context":  "http://schema.org",
                                                     "name":  "Button Name",
                                                     "target":  [
                                                                    "https://google.com.au"
                                                                ],
                                                     "@type":  "ViewAction"
                                                 }
                                             ]
                     }
                 ],
    "text":  " "
}