Как сохранить порядок назначения в структуре в ColdFusion <2016 - PullRequest
2 голосов
/ 05 февраля 2020

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>

Вывод:

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

Как видите, порядок зашифрован.

Вторая проблема - это верхний регистр. Все элементы преобразуются в верхний регистр ...
Это проблема для конверта SOAP, потому что он чувствителен к регистру.

1 Ответ

7 голосов
/ 05 февраля 2020
  1. Order.
    Решение состоит в том, чтобы использовать java LinkedHashMap, который может использоваться точно так же, как структура в ColdFusion.
    Итак, мне просто нужно заменить StructNew();
    with: 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"}}

Красиво упорядочено и регистр сохранен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...