ColdFusion 不保留元素分配给结构的顺序。
在我的特定情况下,当我需要从此结构创建 SOAP 信封并且接收者需要以特定顺序接收信封中的数据时,这就产生了问题。
从 ColdFusion 2016 及更高版本开始,StructNew() 方法中有一个“type”选项,您可以在其中指定“Ordered”。不幸的是,我还在CF9.02上......
例如(在CF9中):
<cfscript>
myStruct=StructNew();
myStruct.one=StructNew();
myStruct.one.item1="Old Trafford";
myStruct.one.item2="Anfield";
myStruct.two=StructNew();
myStruct.two.item3="Stamford Bridge";
myStruct.two.item4="Villa Park";
myStruct.three=StructNew();
myStruct.three.item5="St James Park";
myStruct.three.item6="Emirates Stadium";
WriteDump(myStruct);
</cfscript>
Output:
{"ONE":{"ITEM2":"Anfield","ITEM1":"Old Trafford"},"THREE":{"ITEM6":"Emirates Stadium","ITEM5":"St James Park"},"TWO":{"ITEM4":"Villa Park","ITEM3":"Stamford Bridge"}}
正如您所看到的,顺序是混乱的。
第二个问题是大写字母。所有项目都转换为大写...
对于 SOAP 信封来说这是一个问题,因为它区分大小写。
Order.
解决方案是使用 java LinkedHashMap,它可以像 ColdFusion 中的结构一样使用。
所以,我只需要更换StructNew();
with: createObject("java", "java.util.LinkedHashMap").init();
大写:
通过它们的字符串名称分配/寻址它们。这将保留案件。
所以,例子就变成了:
<cfscript>
myStruct=createObject("java", "java.util.LinkedHashMap").init();
myStruct['one']=createObject("java", "java.util.LinkedHashMap").init();
myStruct['one']['item1']="Old Trafford";
myStruct['one']['item2']="Anfield";
myStruct['two']=createObject("java", "java.util.LinkedHashMap").init();
myStruct['two']['item3']="Stamford Bridge";
myStruct['two']['item4']="Villa Park";
myStruct['three']=createObject("java", "java.util.LinkedHashMap").init();
myStruct['three']['item5']="St James Park";
myStruct['three']['item6']="Emirates Stadium";
WriteDump(SerializeJSON(myStruct));
</cfscript>
Output:
{"one":{"item1":"Old Trafford","item2":"Anfield"},"two":{"item3":"Stamford Bridge","item4":"Villa Park"},"three":{"item5":"St James Park","item6":"Emirates Stadium"}}
订购完好并保存完好!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)