复杂 json 需要 Jolt 规范来压平并将一个字段名称转换为特定名称

问题描述 投票:0回答:1

我有一个复杂的输入 json,其中几乎没有动态字段。我需要 jolt 规范文件,该文件仅允许输出 json 中的特定字段,其余字段将被忽略。因此,我需要指定每个字段,以便只有这些字段才会显示在输出中,而任何额外不需要的字段将被忽略。 我写的震动规范在“未来”标签下给了我确切的日期(例如:“2024-04-14”)。但我需要将其转换为一个名为“Group_Dates”的单个数组,所有项目都在该数组下(类似于输出 json)。

输入JSON:

{
  "metadata": {
    "version": "1.0"
  },
  "message": {
    "id": "2067e529d028-098",
    "code": "PROP",
    "type": "notify",
    "POST": {
      "id": "2067e529d028-cf23",
      "code": "PROP",
      "date": "2024-04-12T00:00:00.000Z",
      "summary": [
        {
          "actual": 3,
          "type": "adults"
        },
        {
          "actual": 5,
          "type": "cancelled"
        }
      ],
      "payments": [
        {
          "actual": 2068.8,
          "type": "CASH",
          "name": "CASH"
        },
        {
          "actual": 0,
          "type": "CP",
          "name": "PAYMENT"
        }
      ],
      "market": [
        {
          "code": "D",
          "name": "DISCOUNT",
          "date": "2024-04-12T00:00:00.000Z"
        },
        {
          "code": "G",
          "name": "REGULAR",
          "date": "2024-04-12T00:00:00.000Z"
        }
      ],
      "future": {
        "2024-04-13": [
          {
            "code": "G",
            "name": "CORPORATE",
            "date": "2024-04-13T00:00:00.000Z",
            "rev": 598,
            "sold": 2
          }
        ],
        "2024-04-14": [
          {
            "code": "G",
            "name": "REGULAR",
            "date": "2024-04-14T00:00:00.000Z",
            "rev": 1388.32,
            "sold": 5
          },
          {
            "code": "D",
            "name": "DISCOUNT",
            "date": "2024-04-14T00:00:00.000Z",
            "rev": 284.05,
            "sold": 1
          },
          {
            "code": "Q",
            "name": "GOVERNMENT",
            "date": "2024-04-14T00:00:00.000Z",
            "rev": 264.33,
            "sold": 3
          }
        ]
      },
      "forecast": [
        {
          "total": 97,
          "dooms": 0
        },
        {
          "total": 97,
          "dooms": 0
        }
      ],
    "timezone": "CST6CDT",
    "change": [
      ""
    ],
    "time": "2024-04-14T11:39:22.522Z",
    "time_zone": "UTC-05:00",
    "date": "2024-04-12T00:00:00.000Z"
    }
  }
}

输出Json:

{
  "metadata" : {
    "version" : "1.0"
  },
  "message" : {
    "id" : "2067e529d028-098",
    "code" : "PROP",
    "type" : "notify",
    "POST" : {
      "id" : "2067e529d028-cf23",
      "code" : "PROP",
      "date" : "2024-04-12T00:00:00.000Z",
      "summary" : [ {
        "actual" : 3,
        "type" : "adults"
      }, {
        "actual" : 5,
        "type" : "cancelled"
      } ],
      "payments" : [ {
        "actual" : 2068.8,
        "type" : "CASH",
        "name" : "CASH"
      }, {
        "actual" : 0,
        "type" : "CP",
        "name" : "PAYMENT"
      } ],
      "market" : [ {
        "code" : "D",
        "name" : "DISCOUNT",
        "date" : "2024-04-12T00:00:00.000Z"
      }, {
        "code" : "G",
        "name" : "REGULAR",
        "date" : "2024-04-12T00:00:00.000Z"
      } ],
      "forecast" : [ {
        "total" : 97,
        "dooms" : 0
      }, {
        "total" : 97,
        "dooms" : 0
      } ],
      "future" : {
    "Group_Dates" : {
    {
      "code" : "G",
      "name" : "CORPORATE",
      "date" : "2024-04-13T00:00:00.000Z",
      "revenue" : 598,
      "sold_count" : 2
    },
    {
      "code" : "G",
      "name" : "REGULAR",
      "date" : "2024-04-14T00:00:00.000Z",
      "revenue" : 1388.32,
      "sold_count" : 5
    },
    {
      "code" : "D",
      "name" : "DISCOUNT",
      "date" : "2024-04-14T00:00:00.000Z",
      "revenue" : 284.05,
      "sold_count" : 1
    },
     {
      "code" : "Q",
      "name" : "GOVERNMENT",
      "date" : "2024-04-14T00:00:00.000Z",
      "revenue" : 264.33,
      "sold_count" : 3
    }
  }
    },
    "timezone" : "CST6CDT",
    "change" : [ "" ],
    "time" : "2024-04-14T11:39:22.522Z",
    "time_zone" : "UTC-05:00",
    "date" : "2024-04-12T00:00:00.000Z"
  }
  
}


震动规格:

[
  {
    "operation": "shift",
    "spec": {
      "metadata": {
        "version": ["metadata.version"],
        "type": ["metadata.type"],
        "source": ["metadata.source"],
        "contentEncoding": ["metadata.contentEncoding"],
        "guid": ["metadata.guid"]
      },
      "message": {
        "id": ["message.id"],
        "code": ["message.code"],
        "type": ["message.type"],
        "POST": {
          "id": ["message.POST.id"],
          "code": ["message.POST.code"],
          "date": ["message.POST.date"],
          "summary": {
            "*": {
              "actual": "message.POST.summary[&1].actual",
              "type": "message.POST.summary[&1].type"
            }
          },
          "payments": {
            "*": {
              "actual": "message.POST.payments[&1].actual",
              "type": "message.POST.payments[&1].type",
              "name": "message.POST.payments[&1].name"
            }
          },
          "market": {
            "*": {
              "code": "message.POST.market[&1].code",
              "name": "message.POST.market[&1].name",
              "date": "message.POST.market[&1].date"
            }
          },
          "future": {
            "*": {
              "*": {
                "code": "&3.&2_&1.code",
                "name": "&3.&2_&1.name",
                "date": "&3.&2_&1.date",
                "rev": "&3.&2_&1.revenue",
                "sold": "&3.&2_&1.sold_count"
              }
            }
          },
          "forecast": {
            "*": {
              "total": "message.POST.forecast[&1].total",
              "dooms": "message.POST.forecast[&1].dooms"
            }
          }
          
         },
          "timezone": ["message.timezone"],
          "change": ["message.change"],
          "time": ["message.time"],
          "time_zone": ["message.time_zone"],
          "date": ["message.date"]
        
      }
    }
  }
]
json jolt
1个回答
0
投票

您可以使用以下移位转换规范:

[
  {
    "operation": "shift",
    "spec": {
      "*": "&",// the objects(or arrays) other than "message"(it's only "metadata" in this case)
      "message": {
        "POST": {
          "*": "&2.&1.&", // the elements other than "future" nested within "POST" object 
          "future": {
            "*": {
              "*": "&4.&3.&2.Group_Dates[]" //&2 stands for the literal "future"
                //&4.&3 is for "message"."POST" 
            }
          }
        }
      }
    }
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.