0

我正在尝试使用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>
4

1 回答 1

1

要允许一组元素位于组中的任何位置,您可以tt:group使用 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="?">.

于 2021-11-17T19:01:29.883 回答