【问题标题】:Jolt spec to parse and transform JSON array用于解析和转换 JSON 数组的 Jolt 规范
【发布时间】:2021-09-08 02:10:57
【问题描述】:

这是我第一次使用 Jolt,我对它可以执行的转换感到惊讶。我在网上关注了文档和一些帖子。

但是,我仍然面临以下挑战:

  • 将新值连接到现有值(本例中为 url)
  • 将连接的值移动到正确的位置
  • 如果输入 JSON 中不存在默认键值对,则添加它
  • 将 JSON 对象分配给正确的 JSON 数组。

我有以下输入

{
  "Body": [
    {
      "username": "some-user"
    },
    {
      "password": "*******"
    }
  ],
  "hostSource": "infos",
  "Host": [
    {
      "HOST_NAME": "xyz.com"
    },
    {
      "PORT": "9085"
    }
  ],
  "Headers": [
    {
      "Content-Type": "application/json"
    }
  ]
}

我的预期输出是:

{
  "templateConfig": {
    "commonClientConfig ": {
      "item": [
        {
          "name": "Main API - BASICAUTH",
          "request": {
            "auth": {
              "type": "basic",
              "basic": [
                {
                  "key": "password",
                  "value": "*******",
                  "type": "string"
                },
                {
                  "key": "username",
                  "value": "some-user",
                  "type": "string"
                }
              ]
            },
            "method": "GET",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json",
                "type": "text"
              }
            ],
            "url": {
              "raw": "xyz.com/v9085/some-default-value"
            }
          }
        }
      ]
    }
  }
}

在参考了一些帖子和文档之后,我能够通过规范做到这一点:

 [
  {
    "operation": "shift",
    "spec": {
      "Body": {
        "*": {
          "*": {
            "$": "commonClientConfig.item.request.auth.basic[&2].key",
            "@(1,&)": "commonClientConfig.item.request.auth.basic[&2].value"
          }
        }
      },
      "Headers": {
        "*": {
          "*": {
            "$": "commonClientConfig.item.request.header[&2].key",
            "@(1,&)": "commonClientConfig.item.request.header[&2].value"
          }
        }
      },
      "Host": {
        "*": {
          "*": {
            "@(1,&)": "commonClientConfig.item.request.url.raw"
          }
        }
      }
    }
    },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "content": "=join('/', @(2,commonClientConfig.item.request.url.raw))"
    }
  }    
]

如果有人可以在这里提供一些指导和解释,我将不胜感激。

【问题讨论】:

    标签: json jolt


    【解决方案1】:

    您可以使用以下连续规格

    [
      {
        "operation": "shift",
        "spec": {
          "#Main API - BASICAUTH": "name",
          "Body": {
            "#basic": "request.auth.type",
            "*": {
              "*": {
                "$": "request.auth.basic[&2].key",
                "@": "request.auth.basic[&2].value",
                "#string": "request.auth.basic[&2].type"
              }
            }
          },
          "Headers": {
            "#GET": "request.method",
            "*": {
              "*": {
                "$": "request.header[&2].key",
                "@": "request.header[&2].value",
                "#text": "request.header[&2].type"
              }
            }
          },
          "Host": {
            "*": {
              "*": {
                "@": "request.url"
              }
            }
          }
        }
      },
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "request": {
            "url": "=join('/', @(2,request.url))"
          }
        }
      },
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "request": {
            "url": "=concat(@(1,url), /some-default-value)"
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "*": "&",
          "request": {
            "*": "&1.&",
            "url": "&1.&.raw"
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "@": "templateConfig.commonClientConfig.item[]"
        }
      }
    ]
    

    在哪里

    • join 函数用于从组合中导出连接的字符串 数组的每个元素都没有重复提及它们,而 concat 仅用于处理 默认字符串。
    • 注意最里面的公共键是request,对于数组BodyHeadersHost,应该根据需要单独处理,最后在公共节点下累积(@987654330 @) 在最后一个班次规范中。

    【讨论】:

    • 你能解释一下层级结构中的 url 创建和移动,尤其是最后一个 shift 操作吗?此外,根据原始问题,url 值需要与输入 json 中不存在的附加值进行连接,如何连接?
    • 嗨@Barbaros - 谢谢。使用这些令牌是否有任何提示/技巧?例如。如果我必须理解,这个规范是做什么的->“*”:“&1.&”,“url”:“&1.&.raw”?除非您使用正确的规格,否则结果并不明显。另一方面,我正在探索使用 Kotlin 的 mapneat 库,它会打印调试语句,告知变量可用的值。
    • @Dwarrior Jolt 只是在 github 下开发的一个库,据我所知没有这样的 IDE 或框架,但您可以使用 the site ,我也使用它,作为游乐场通过尝试和捕捉的方法来发展理解力。我喜欢这样做的方式:)顺便说一句,如果你有时间,请查看我最近的答案。
    • 再次感谢你让我走这么远,我将进行更多的转换以更好地了解这个库。如果我无法实现某些目标,将打开新帖子。我真的很喜欢这个库的强大功能,但文档中的示例并不详尽。
    • 我又尝试了一个示例,并在此处发布了有关该问题的问题 - stackoverflow.com/questions/69211561。如果您能就我使用 JOLT 解决此问题的方式提供任何反馈,我将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多