忽略 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="?">
.
我正在尝试使用 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="?">
.