簡體   English   中英

忽略 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並嵌套tt:cond (以及類似的)

以任何順序具有<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="?">

暫無
暫無

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

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