2016-06-13 13 views
0

Ich muss durchlaufen List<Map<String, List<Map<String, String>>>> und drucken Sie alle seinen Inhalt.Freemarker - Iterate durch verschachtelte Karten und verschachtelte Listen

Mein Problem ist, dass jedes Mal, wenn ich map Klammer-Syntax (like in the documentation) auf verschachtelten Ebenen verwende ich ein Syntaxproblem habe. Können Sie mir zeigen, wie verschachtelte Ebenen für einen Typ wie List<Map<String, List<Map<String, String>>>> gehandhabt werden?

Ich habe dies getestet:

<!-- List<Map<String, List<Map<String, String>>>> --> 
<#list myList as map1> 

    <!-- Map<String, List<Map<String, String>>> --> 
    <#list map1?keys as key1> 
     My Key: ${key1} 

     <!-- List<Map<String, String>> --> 
     <#list map1[key1] as map2> 


      <!-- Map<String, String> --> 
      <#list map2?keys as key2> 
       My Key: ${key2} | My Value: ${map2[key2]} 
      </#list> 
     </#list> 
    </#list> 
</#list> 

Und ich habe diesen Fehler:

java.lang.RuntimeException: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: 
==> map1[key1] [in template "hello.html" at line 39, column 32] 

---- 
Tip: It's the final [] step that caused this error, not those before it. 
---- 
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? 
---- 

---- 
FTL stack trace ("~" means nesting-related): 
    - Failed at: #list map1[key1] as map2 [in template "hello.html" at line 39, column 25] 
---- 

ich verwende Freemarker 2.3.23. Vielen Dank.

+0

Können Sie die nicht arbeitende Vorlage Schnipsel zitieren? – ddekany

+0

Ich habe mein Thema mit dem nicht funktionierenden Template-Snippet aktualisiert :) – Gugelhupf

+0

Haben Sie überprüft, was der Wert von 'key1' ist, wo es fehlschlägt? – ddekany

Antwort

0

Obwohl eine alte Frage, teilen die Antwort als Titel ist sehr generisch und Benutzer können oft landen hier auf der Suche nach einer Lösung. Beachten Sie, dass die Eingabe ein Map ist, obwohl unser Fokusdatentyp ein List ist und die Liste mit Daten in der Karte mit Schlüssel myList hinzugefügt wird, der dasselbe wie in der Vorlage erwähnt ist. Dies gilt gemäß der Bibliothek Anforderung unten angegeben -

Generally, you want to use a Map or a JavaBean as the root-map (aka. data-model) parameter. The Map key-s or JavaBean property names will be the variable names in the template.

public static void main(String[] args) { 
     Map<String, Object> input = new HashMap<String, Object>(); 
     List<Map<String, List<Map<String, String>>>> l1 = new ArrayList<>(); 
     Map<String, List<Map<String, String>>> m1 = new HashMap<>(); 
     List<Map<String, String>> l2 = new ArrayList<Map<String,String>>(); 
     Map<String, String> m2 = new HashMap<String, String>(); 

     m2.put("m2", "m2v"); 
     l2.add(m2); 
     m1.put("m1", l2); 
     l1.add(m1); 
     input.put("myList", l1); 

     System.out.println(l1); 

     Configuration cfg = new Configuration(); 
     try{ 
      FileTemplateLoader ftl = new FileTemplateLoader(new File("C:\\temp")); 
      cfg.setTemplateLoader(ftl); 
      Template temp = cfg.getTemplate("aa.ftlh"); 
      temp.process(input, new OutputStreamWriter(System.out)); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
+0

Nun, danke, aber das beantwortet meine Frage nicht, ich suchte nach einem FreeMarker Template Beispiel mit einer komplexen Liste von Maps. – Gugelhupf

+0

Der von mir freigegebene Code funktioniert mit der Vorlage, die Sie in der Frage angegeben haben. Was hilft das nicht? –

+0

Der Code, den Sie teilen, ist Java-Code, ich suche nach FreeMarker Vorlagencode, weil mein FreeMarker Vorlagencode nicht funktioniert. – Gugelhupf