当前位置: 首页 > 知识库问答 >
问题:

使用Jolt转换复杂的Json数组

吴开宇
2023-03-14

当调用外部API时,我收到了一个复杂的json结构,我需要根据我们的需要将其转换为简单的json。我发现jolt具有转换json的能力,但无法提出jolt规范。

我的输入Json数组——

{
  "attribute": [
    "teamalloc",
    "prodAlloc"
  ],
  "item": {
    "id": "abcde",
    "name": "Champak Kumar",
    "allocDetails": {
      "updatedAt": "2020-08-10T14:26:48-07:00",
      "token": 1134,
      "items": [
        {
          "allocation": 0.2,
          "team": {
            "id": 90,
            "name": "Some Team Name 1",
            "createdAt": "2010-01-19T10:52:52-07:00"
          }
        },
        {
          "allocation": 0.9,
          "team": {
            "id": 80,
            "name": "Some Team Name 2",
            "createdAt": "2010-01-19T10:52:52-07:00",
            "product": {
              "id": 20,
              "name": "Some Product Name 1",
              "otherDetails": {
                "key": "Id",
                "value": "GEC"
              }
            }
          }
        },
        {
          "allocation": 0.1,
          "team": {
            "id": 10,
            "name": "Some Team Name 3",
            "createdAt": "2010-01-19T10:52:52-07:00",
            "product": {
              "id": 22,
              "name": "Some Product Name 2",
              "otherDetails": {
                "key": "Id1",
                "value": "GEC1"
              }
            }
          }
        }
      ]
    }
  }
}

我的输出 Json 结构应该看起来像 -

{
  "name": "Champak Kumar",
  "allocDetails": [
    {
      "allocation": 0.2,
      "team": {
        "id": 90,
        "name": "Some Team Name 1"
      }
    },
    {
      "allocation": 0.9,
      "team": {
        "id": 80,
        "name": "Some Team Name 2",
        "product": {
          "id": 20,
          "name": "Some Product Name 1"
        }
      }
    },
    {
      "allocation": 0.1,
      "team": {
        "id": 10,
        "name": "Some Team Name 3",
        "product": {
          "id": 22,
          "name": "Some Product Name 2"
        }
      }
    }
  ]
}

我尝试了多种jolt规格,但无法得到想要的输出。这种情况下最理想的jolt规格应该是什么?

共有2个答案

屈星腾
2023-03-14

工作震动规格——

  {
    "operation": "shift",
    "spec": {
      "item": {
        "name": "name",
        "allocDetails": {
          "items": {
            "*": {
              "allocation": "allocDetails[&1].allocation",
              "team": {
                "id": "allocDetails[&2].team.id",
                "name": "allocDetails[&2].team.name",
                "product": {
                  "id": "allocDetails[&3].team.product.id",
                  "name": "allocDetails[&3].team.product.name"
                }
              }
            }
          }
        }
      }
    }
  }
]```
韩鸿
2023-03-14

这个规范应该使用移位操作应该起作用:

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "name": "name",
        "allocDetails": {
          "items": {
            "*": {
              "allocation": "allocDetails[&1].allocation",
              "team": {
                "id": "allocDetails[&2].team.id",
                "name": "allocDetails[&2].team.name",
                "product": "allocDetails[&2].team.product"
              }
            }
          }
        }
      }
    }
  }
]

编辑#1:

解释:shift 操作规范定义了我们希望将输入 json 中的值放在结果 json 中的位置。

  1. 规范中的每个键值对都定义了源-目标关系。例如(让我们从最简单的开始):来自["项目"]["名称"]的值将位于输出JSON中的["名称"]键下。
 "items": {
    "*": {
      ...
    }
 }

部分说:“对于‘items’键下的数组的每个元素,执行< code >... "

...
"name": "allocDetails[&2].team.name"
...

说:“将”名称“键下的值(即在 item[”items“][56][”team“][”name“] 中放置在 ”allocDetails“ 键下的数组的第 57 个元素中。

“*”与第57个元素匹配

看看< code > shift operation javadocs ,尤其是在< code > "

编辑#2:考虑其他详细信息注释:您也可以像这样处理它:

...
    "team": {
        "id": "allocDetails[&2].team.id",
        "name": "allocDetails[&2].team.name",
        "product": {
            "otherDetails": null,
            "*": "allocDetails[&3].team.product.&"
        }
    }
...

以上:将产品的所有部件键(与“*”匹配)放入具有相同名称的键(

 类似资料:
  • 我试图根据第二个嵌套数组中的值的数量将嵌套数组转换为对象。我似乎无法获取值字段的数量并将其用作规范中的键。现在这是我的输入JSON文件: 这是我想要的JSON输出: 这是我目前的规格 有人有类似的情况吗?

  • 我有一个关于使用jolt将平面json转换成嵌套json的问题。我对jolt很陌生,这是我的意见 我编写了jolt spec,但我没有得到想要的输出 我的预期产出是: 任何震动专家都可以帮助我获得所需的输出。我应该在颠簸中使用多个变换,还是可以在一个震动变压器中获得所需的输出?

  • 我希望Jolt将一个复杂的json转换为下面所需的json。 输入JSON: 输出量的希望值 我试过遵循Jolt Spec 但得到了以下输出 因此,正如所见,除了最后一个级别值之外,所有其他值都具有具有重复值的数组。任何人都可以帮助解决 Jolt 规范中缺失或错误的地方吗?

  • 我有一个复杂的Json,我想使用Jolt或任何其他方式在Nifi中展平Json。也可以。任何人都可以帮助展平下面的Json吗 以上是我的Json,我需要将其扁平化为简单的Json,以便我可以在Hive中处理它。我曾尝试使用flatten Json处理器,但它不起作用,所以现在我正在尝试使用jolt规范。请任何人使用jolt转换或在Nifi中指导我解决上述问题。 我的预期输出如下 我已经更新了请求

  • 我是JOLT转换的新手,我发现它在JSON转换中非常有用。但是当我遇到嵌套且复杂的JSON时,我感到困惑。 下面的JSON是一个嵌套且复杂的JsonArray,我需要将其转换为完全扁平的JsonArray。 JSON输入: 如您所见,我们有一个空的对象“字母类型”:[],但在其他Json对象中,“字母类型”有自己的对象并且不是空的。 下面的JSON是我的预期输出。 预期输出: 我需要的是一个JOL

  • `我有以下输入json格式,需要转换以下json文件。我正在使用jolt转换,但无法使用https://jolt-demo.appspot.com/#inception网站正确格式化输出 `需要以下使用JOLT Iam的输出json格式,尝试使用JOLT转换进行转换