簡體   English   中英

JOLT 中的條件 JSON 轉換

[英]conditional JSON transformation in JOLT

我需要處理來自 SOLR 服務的響應,如下所示:

{
  "data": {
    "distanceUnits": "mi", //it can be "mi", "MI", "miles", "km", "KM", etc.
    "solrResponse": {
      "header": {
        "found": 32,
        "retrieved": 10,
        ... //there can be other things like timestamp
      },
      "results": [
        {
          "matchScore": "08768",
          "indicators" [{...}],
          "location": {
             ... //there are about hundred attributes
            "distance": "2.7649" //distance always in km
            "similarity": "0.342"
        },
        ...
      ]
}

轉換需要從 solrResponse 返回幾乎完整的所有內容,除了兩件事:

  1. similarity 需要重命名為 similarityScore 並向上移動到 matchScore 旁邊。
  2. 如果 distanceUnit 指定為英里,距離需要轉換為英里(即除以 1.609)
  3. 距離值四舍五入到小數點后2位,並與distanceUnit連接。 我創建了以下規范:
[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "unit1": "=toLower(@(1,distanceUnit))",
        "unit2": "=substring(@(1,unit1),0,1)",
        "solrResponse": {
          "results": {
            "": {
              "dist1": "=divideAndRound(2,@(1,distance),0.6215)",
              "distanceMiles": "=concat(@(1,dist1), ' ', @(2,distanceUnit))",
              "dist2": "=divideAndRound(2,@(1,distance),1.0)",
              "distanceKm": "=concat(@(1,dist2), ' ', @(2,distanceUnit))"
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "data": {
        "solrResponse": {
          "header": "&1",
          "response": {
            "": {
              "&1.similarity": "similarityScore",
              "unit2": {
                "m": {
                  "distanceMiles": "locations.distance"
                },
                "": {
                  "distanceKm": "locations.distance"
                }
              },
              "": "&1"
            }
          }
        }
      }
    }
  }
]

不幸的是它不起作用。 請幫我。

Jolt 沒有 function,例如multiplyproduct ,但是dividedivideAndRound用於修改轉換規范。 然后,我們將有一個條件來過濾distanceUnit屬性的提供值是否存在於列表( mi,m,Mi,MI )中,例如

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": { // this outer one represents "locations" list(if there's no other outer level list or object, otherwise replace "*" with the key name "locations") 
        "*": { // this one stands for "locations" list's indexes
          "distanceinMiles_": "=divideAndRound(2,@(1,distance),0.6215040397762585)",
          "distanceinMiles": "=concat(@(1,distanceinMiles_),' ',@(1,distanceUnit))",
          "distance_": "=divideAndRound(2,@(1,distance),1)",
          "distance": "=concat(@(1,distance_),' ',@(1,distanceUnit))"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "address": "&2[&1].&",
          "city": "&2[&1].&",
          "state": "&2[&1].&",
          "postalCode": "&2[&1].&",
          "distanceUnit": {
            "mi|m|Mi|MI": { "@(2,distanceinMiles)": "&4[&3].distance" },
            "*": { "@(2,distance)": "&4[&3].distance" }
          }
        }
      }
    }
  }
]

在哪里

  • 第一個規范中的@(1,distanceXx)表示遍歷一個冒號 ( : )(作為右側元素)以達到元素@(1,distanceXx)的原始級別,而@(2,distanceXx)代表遍歷{ (object opening "curly" brace) 兩次以達到相同。

  • “locations”索引級別的屬性分別使用[&1][&3]組合

  • &2&4分別代入表示鍵名"locations"

網站http://jolt-demo.appspot.com/上的演示:

在此處輸入圖像描述

編輯對您上次編輯的回應):考慮輸入

{
  "data": {
    "distanceUnit": "Mi",
    "solrResponse": {
      "header": {
        "found": 32,
        "retrieved": 10
      },
      "results": [
        {
          "matchScore": "08768",
          "location": {
            "distance": "2.7649",
            "similarity": "0.342"
          }
        }
      ]
    }
  }
}

您可以使用以下規格

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "distanceUnit": "=toLower(@(1,&))",
        "solrResponse": {
          "results": {
            "*": {
              "location": {
                "dist1": "=divideAndRound(2,@(1,distance),0.6215)",
                "distanceKm": "=concat(@(1,dist1), ' km')",
                "dist2": "=divideAndRound(2,@(1,distance),1.0)",
                "distanceMiles": "=concat(@(1,dist2), ' km')"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": "&1.&",
        "solrResponse": {
          "*": "&2.&1.&",
          "results": {
            "*": {
              "*": "&4.&3.&2[&1].&",
              "location": {
                "@(4,distanceUnit)": {
                  "mi": { "@(2,distanceKm)": "&7.&6.&5[&4].&3.distance" },
                  "km": { "@(2,distanceMiles)": "&7.&6.&5[&4].distance" }
                },
                "similarity": "&5.&4.&3[&2].&Score"
              }
            }
          }
        }
      }
    }
  }, 
  {
    "operation": "sort"
  }
]

演示是:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM