将 json 转换为数组并处理空字符串和 null 字符串

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

输入:Null 和空字符串已正确处理,但问题在于设置 tempName 和 name 的值。

如果 tempName="" 或 null,则 name 的值需要相同。名称值没有变化。

如果 tempName="SomeValue",则名称字段必须设置为“SomeValue”

下面是 tempName 为 null 且名称为 test1 的输入规范

`
[
  {
    "bI": {
      "id": "t1",
      "locale": [
        "id_ID",
        "id_ID"
      ],
      "tempName": "",
      "name": "Test1",
      "isActive": false,
      "pT": "Re"
    },
    "id": "t1",
    "ContextID": "id_ID",
    "cf": {
      "name": "asd"
    },
    "dE": {
      "sS": "arte"
    },
    "mk": {},
    "pd": {}
  }
]`

下面是适用于处理 tempName 的 null 和空值的规范。这是按预期处理的

`[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[&1].&",
        "bI": {
          "*": "[&2].bI.&",
          "tempName": {
            "": "[&3].&2.&1",
            "*": {
              "@1": "[&4].&3.&2"
            }
          }
        }
      }
    }
  }
]`

场景 1:当上述规范应用于 tempName="" 的输入 json 时,tempName 的输出将设置为 null,如下所示。

`[ {
  "bI" : {
    "id" : "t1",
    "locale" : [ "id_ID", "id_ID" ],
    "tempName" : null,
    "name" : "Test1",
    "isActive" : false,
    "pT" : "Re"
  },
  "id" : "t1",
  "ContextID" : "id_ID",
  "cf" : {
    "name" : "asd"
  },
  "dE" : {
    "sS" : "arte"
  },
  "mk" : { },
  "pd" : { }
} ]`

场景 2:当上述规范应用于 tempName="abc" 的输入 json 时,tempName 的输出将设置为“abc”,如下所示。

 
`[ {
  "bI" : {
    "id" : "t1",
    "locale" : [ "id_ID", "id_ID" ],
    "tempName" : "abc",
    "name" : "Test1",
    "isActive" : false,
    "pT" : "Re"
  },
  "id" : "t1",
  "ContextID" : "id_ID",
  "cf" : {
    "name" : "asd"
  },
  "dE" : {
    "sS" : "arte"
  },
  "mk" : { },
  "pd" : { }
} ]`

使用上述规范,可以处理 tempName 的 null 和空字符串值,但是何时

场景 3 当 tempName="" 或 tempName=null 名称时,值需要保持原样。

场景 4 当 tempName="abc" 时,name 的值设置为“abc”作为 tempName

但是,场景 1 和 2 使用以下规范进行处理,但场景 3 和 4 不起作用。

处理所有场景的最终规范:

`[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[&1].&",
        "bI": {
          "*": "[&2].bI.&",
          "tempName": {
            "": "[&3].&2.&1",
            "*": {
              "@1": "[&4].&3.&2"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "name": "=notNull(@(1,tempName))"
      }
    }
  },
{
    "operation": "remove",
    "spec": {
      "*": {
        "tempName": ""
      }
    }
  }
 
 
]`

预期输出:

当 tempName=""时

`
[ {
  "bI" : {
    "id" : "t1",
    "locale" : [ "id_ID", "id_ID" ],
    "tempName" : null,
    "name" : "Test1",
    "isActive" : false,
    "pT" : "Re"
  },
  "id" : "t1",
  "ContextID" : "id_ID",
  "cf" : {
    "name" : "asd"
  },
  "dE" : {
    "sS" : "arte"
  },
  "mk" : { },
  "pd" : { }
} ]`

当 tempName="abc" 时

 
`[ {
  "bI" : {
    "id" : "t1",
    "locale" : [ "id_ID", "id_ID" ],
    "tempName" : "abc",
    "name" : "abc",
    "isActive" : false,
    "pT" : "Re"
  },
  "id" : "t1",
  "ContextID" : "id_ID",
  "cf" : {
    "name" : "asd"
  },
  "dE" : {
    "sS" : "arte"
  },
  "mk" : { },
  "pd" : { }
} ]`
string null transform jolt
1个回答
0
投票

我不确定我是否完全理解你的问题,但我尝试在不同的场景下运行你的规范(

TempName
=“”,null和“value”)并注意到有时它没有产生达到预期的结果。

例如,当

tempName
被填充时,
name
的值没有变化;这是因为您在
modify-overwrite-beta
中编写的规范并不完全正确 - 您没有正确指定值的位置。当
tempName
设置为 null 时出现另一个问题;在这种情况下,由于 Jolt 的逻辑,该值消失了。要解决这个问题,您只需在要保留的值的开头添加一个下划线(“_”)(“_somekey”检查
somekey
是否已经存在,如果不存在,则创建它,否则它什么都不做)。

最终规格与您提供的规格几乎相同,仅进行了一些调整:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[&1].&",
        "bI": {
          "*": "[&2].bI.&",
          "tempName": {
            "": "[&3].&2.&1",
            "*": {
              "@1": "[&4].&3.&2"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "bI": {
          "_tempName": null,
          "name": "=notNull(@(1,tempName))"
        }
      }
    }
  }
]

我删除了

remove
规范,因为我不明白它在你的问题中的用途。
让我知道这是否有帮助或者我是否误解了某些内容。

© www.soinside.com 2019 - 2024. All rights reserved.