Home > Blockchain >  Jolt Spec for masking cards
Jolt Spec for masking cards

Time:01-12

How can I iterate through list and replace some elements in it? I have this input

{
  "clients": [
    {
      "clientId": "166734",
      "info": {
        "cards": [
          "378282246310005",
          "371449635398431"
        ]
      }
    }
  ]
}

What I expect cards will looks like this "cards" : [ "3782", "3714" ]

But in my spec do not work substring

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "clients": {
        "*": {
          "info": {
            "cards": {
              "*": "=substring(@(1,&),0,@(1,4))"
            }
          }
        }
      }
    }
  }
]

CodePudding user response:

You can use shift transformations to tame the cards array in order to prepare for modify transformation spec such as

[
  {
    "operation": "shift",
    "spec": {
      "clients": {
        "*": {
          "*": "&2[#2].&",
          "info": {
            "cards": {
              "*": {
                "@": "&5[#5].&3.&2.&"
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "clients": {
        "*": {
          "info": {
            "cards": {
              "*": "=substring(@(1,&),0,4)"
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "clients": {
        "*": {
          "*": "&2[#2].&",
          "info": {
            "cards": {
              "*": "&4[#4].&2.&1[#1]"
            }
          }
        }
      }
    }
  }
]

If there can always only exist two components for cards then we make the whole spec shorter by using [first/last]Element functions, otherwise use "=(@(1,cards[0/1]))" by individually writing such as

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "clients": {
        "*": {
          "info": {
            "c0": "=firstElement(@(1,cards))", //or "=(@(1,cards[0]))"
            "c1": "=lastElement(@(1,cards))",  //or "=(@(1,cards[1]))"
            "cards0": "=substring(@(1,c0),0,4)",
            "cards1": "=substring(@(1,c1),0,4)"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "clients": {
        "*": {
          "*": "&2[#2].&",
          "info": {
            "*s*": "&3[#3].&1.&(0,1)s"
          }
        }
      }
    }
  }
]

CodePudding user response:

Note 1:

You should not use @(1,&) for getting an array index.

@(1,&) says: Go up 1 level (cards) and get 0 and 1 key from the array with &. But You have an array and should get the index from it.

You can say get & in an array like this: @(1,[&])

Note 2:

For getting the first 4 elements in the string you don't need the @(1,4). just say 4

Simpler solution:

We can get the current level without going up 1 level with @(0) or @0: @0,0,4

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "clients": {
        "*": {
          "info": {
            "cards": {
              "*": "=substring(@0,0,4)"
            }
          }
        }
      }
    }
  }
]
  • Related