如何在 ColdFusion <2016 中保留结构中的分配顺序

Gun*_*erO 2 coldfusion struct

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>
Run Code Online (Sandbox Code Playgroud)

输出:

{"ONE":{"ITEM2":"Anfield","ITEM1":"Old Trafford"},"THREE":{"ITEM6":"Emirates Stadium","ITEM5":"St James Park"},"TWO":{"ITEM4":"Villa Park","ITEM3":"Stamford Bridge"}}
Run Code Online (Sandbox Code Playgroud)

如您所见,订单被打乱了。

第二个问题是大写。所有项目都转换为大写...
这是 SOAP 信封的问题,因为它区分大小写。

Gun*_*erO 7

  1. 命令。
    解决方案是使用 java LinkedHashMap,它可以像 ColdFusion 中的结构一样使用。
    所以,我只需要替换 StructNew();
    为:createObject("java", "java.util.LinkedHashMap").init();

  2. 大写:
    通过它们的字符串名称分配/寻址它们。这将保留案例。

因此,示例变为:

<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>
Run Code Online (Sandbox Code Playgroud)

输出:

{"one":{"item1":"Old Trafford","item2":"Anfield"},"two":{"item3":"Stamford Bridge","item4":"Villa Park"},"three":{"item5":"St James Park","item6":"Emirates Stadium"}}
Run Code Online (Sandbox Code Playgroud)

精心订购并保存完好!