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



ColdFusion不保留元素分配给结构的顺序。
在我的特殊情况下,当我需要从此结构创建 SOAP 信封并且接收方需要按特定顺序在信封中数据时,这会产生问题。
从 ColdFusion 2016 及更高版本开始,StructNew(( 方法中有一个"类型"选项,您可以在其中指定"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>

输出:

{"ONE":{"ITEM2":"Anfield","ITEM1":"Old Trafford"},"THREE":{"ITEM6":"Emirates Stadium","ITEM5":"St James Park"},"TWO":{"ITEM4":"Villa Park","ITEM3":"Stamford Bridge"}}

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

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

  1. Order。
    解决方案是使用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>

输出:

{"one":{"item1":"Old Trafford","item2":"Anfield"},"two":{"item3":"Stamford Bridge","item4":"Villa Park"},"three":{"item5":"St James Park","item6":"Emirates Stadium"}}

井井有条,保存完好!

Adobe ColdFusion(2018 Release(。 我不确定最早的版本。

ColdFusion 不会保留元素分配给结构的顺序。

尝试改用数组。CF 中的结构基本上是关联数组,在这种情况下,您使用的是实际键值而不是索引。

var yourCollection = [
"one" = ["item1" = "Old Trafford", "item2" = "Anfield"],
"two" = ["item3" = "Stamford Bridge", "item4" = "Villa Park"],
"three" = ["item5" = "St James Park", "item6" = "Emirates Stadium"]
];

第二个问题是大写。所有项目都转换为大写...

用引号包装键,输出应保留大小写,至少在当前版本中。

最新更新