【问题标题】:Make changes to json string using jsonnet使用 jsonnet 更改 json 字符串
【发布时间】:2019-02-26 08:11:35
【问题描述】:

我想使用 jsonnet 在下面的 json 中更改 alok-pod.json 中的 namespace

{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "data": {
                "alok-pod.json": "{\n  \"namespace\": \"alok\",\n  \"editable\": true,\n}"
            }
        },
    ]
}

请建议如何使用 jsonnet 来完成?

【问题讨论】:

  • 问题与 [kubernetes] 或 [prometheus] 无关。
  • 同意。但是 kubernetes 和 prometheus 的观众可以提供帮助,因为这是那里的常见用例
  • 顺便说一句,alok-pod.json 值是来自其最后一个 , 的无效 json。
  • 我刚刚发布了一个小库,旨在帮助解决这样的案例:github.com/sbarzowski/jsonnet-modifiers

标签: json kubernetes prometheus jsonnet


【解决方案1】:

注意,您需要从 master 构建的 jsonnet 二进制文件,因为截至 2019 年 2 月 26 日,std.parseJson() 尚未发布。

input.json

{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "data": {
                "alok-pod.json": "{\n  \"namespace\": \"alok\",\n  \"editable\": true\n}"
            }
        },
    ]
}

edit_ns.jsonnet

// edit_ns.jsonnet for https://stackoverflow.com/questions/54880959/make-changes-to-json-string-using-jsonnet
//
// NOTE: as of 2019-02-26 std.parseJson() is unreleased, 
// need to build jsonnet from master.

local input = import "input.json";

local edit_ns_json(json, ns) = (
  std.manifestJson(std.parseJson(json) { namespace: ns })
);

local edit_ns(x, ns) = (
  x {
    local d = super.data,
    data+: {
      [key]: edit_ns_json(d[key], ns) for key in std.objectFields(d)
    }
  }
);

[edit_ns(x, "foo") for x in input.items]

示例运行:

$ jsonnet-dev edit_ns.jsonnet
[
   {
      "apiVersion": "v1",
      "data": {
         "alok-pod.json": "{\n    \"editable\": true,\n    \"namespace\": \"foo\"\n}"
      }
   }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多