忽略 JSON 自写转换的顺序和缺失字段

Ignore order and missing fields for Self-Written Transformations for JSON

我正在尝试使用 Self-Written Transformations for JSON 而不是 Identity Transformation ID 从外部服务器反序列化 JSON。

但是,这仅在所有字段都按指定顺序排列时才有效(JSON 规范不保证)。缺少字段也是一个问题,会引发异常。

有什么方法可以复制 ID 行为(对于任何顺序和缺少的字段都可以),但让我自己定义字段名称?

示例JSON

{
    "d": {
        "__abc": "111",
        "results": [
            {
                "__metadata": {
                    "id": "SOME_ID",
                    "uri": "SOME_URI",
                    "type": "SOME_TYPE"
                },
                "FieldA": "X",
                "FieldB": "X"
            },
            {
                "__metadata": {
                    "id": "SOME_ID2",
                    "uri": "SOME_URI2",
                    "type": "SOME_TYPE2"
                },
                "FieldA": "Y",
                "FieldB": "QQ"
            }
        ]
    }
}

由于 Sandra 的成功转变:

<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" version="0.1">
  <tt:root name="ROOT" type="?"/>
  <tt:template>
    <object>
      <object name="d">
        <str name="__abc">
          <tt:value ref=".ROOT.d.__abc"/>
        </str>

        <array name="results">
          <tt:loop name="S_RESULT" ref=".ROOT.d.results">
            <object>
              <object name="__metadata">
                <tt:skip/>
                <!--<str name="id">
                  <tt:value ref="$S_RESULT.__metadata.id"/>
                </str>
                <str name="uri">
                  <tt:value ref="$S_RESULT.__metadata.uri"/>
                </str>
                <str name="type">
                  <tt:value ref="$S_RESULT.__metadata.type"/>
                </str>-->
              </object>
              <tt:group>
                <tt:cond>
                  <str name="FieldA">
                    <tt:value ref="$S_RESULT.FIELDA"/>
                  </str>
                </tt:cond>
                <tt:cond>
                  <str name="FieldB">
                    <tt:value ref="$S_RESULT.FIELDB"/>
                  </str>
                </tt:cond>
              </tt:group>
            </object>
          </tt:loop>
        </array>
      </object>
    </object>
  </tt:template>
</tt:transform>

要允许一组元素位于组中的任何位置,您可以将它们包装成 tt:group with nested tt:cond (and alike).

<str name="FieldA">...</str><str name="FieldB">...</str> 任意顺序的示例:

              <tt:group>
                <tt:cond>
                  <str name="FieldA">
                    <tt:value ref="$S_RESULT.FIELDA"/>
                  </str>
                </tt:cond>
                <tt:cond>
                  <str name="FieldB">
                    <tt:value ref="$S_RESULT.FIELDB"/>
                  </str>
                </tt:cond>
              </tt:group>

如果你想让其中之一成为可选的(或两者),你可以使用 <tt:cond frq="?">.