2013-03-21 5 views
5

ich diesen Code verwenden in HTML unter JSON-Daten in eine Vorlage zu fusionieren, bekommen HTML:Schnurrbart Vorlage nehmen, übergibt JSON und Konvertieren

Vorlage:

String schema = "<h1>{{header}}</h1>" 
    + "{{#bug}}{{/bug}}" 
    + "{{#items}}" 
    + "{{#first}}" 
    + "<li><strong>{{title}}</strong> 
    + </li>" 
    + "{{/first}}" 
    + "{{#link}}" 
    + "<li><a href=\"{{url}}\">{{name}} 
    + </a></li>" 
    + "{{/link}}" 
    + "{{/items}}" 
    + "{{#empty}}" 
    + "<p>The list is empty.</p>" 
    + "{{/empty}}"; 

JSON-Objekt:

try { 
    String template = "{\"header\": \"Colors\", " 
     + "\"items\": [ " 
     + "{\"name\": \"red\", \"first\": true, \"url\": \"#Red\"}, " 
     + "{\"name\": \"green\", \"link\": true, \"url\": \"#Green\"}, " 
     + "{\"name\": \"blue\", \"link\": true, \"url\": \"#Blue\"}" 
     + " ], \"empty\": false }"; 

    JSONObject jsonWithArrayInIt = new JSONObject(template); 
    JSONArray items = jsonWithArrayInIt.getJSONArray("items"); 

    Map<String,String> ctx = new HashMap<String,String>(); 
    ctx.put("foo.bar", "baz"); 
    Mustache.compiler().standardsMode(true).compile("{{foo.bar}}").execute(ctx); 

    System.out.println("itemised: " + items.toString()); 
} catch(JSONException je) { 
    //Error while creating JSON. 
} 

Ich übergebe eine Karte von Daten, um Mustache zu arbeiten. Das Verfahren sieht wie folgt aus:

public static Map<String, Object> toMap(JSONObject object) 
     throws JSONException { 
    Map<String, Object> map = new HashMap(); 
    Iterator keys = object.keys(); 

    while (keys.hasNext()) { 
     String key = (String) keys.next(); 
     map.put(key, fromJson(object.get(key))); 
    } 

    return map; 
} 

ich Mustache Guide bin nach dem Schnurrbart autoformation zu erhalten. Aber ich weiß nicht, wie ich das Ergebnis bekomme, das ich erwarte. Die Ausgabe sollte wie folgt sein:

<h1>Colors</h1> 
<li><strong></strong></li> 
<li><a href="#Green">green</a></li> 
<li><a href="#Blue">blue</a></li> 

Antwort

1

verwende ich glaube, Sie brauchen etwas Ihre Schnurrbart-Vorlage zu überdenken. Die jMustache Bibliothek (die ich nehme an, Sie verwenden) scheint immer {{# Entitäten als Listen zu behandeln und deren Inhalt iterieren, unabhängig von der Art Daten übergeben in

So etwas sollte funktionieren.

Diese erzeugt nur dann einen HMTL-Anker, wenn ein "Link" -Wert bereitgestellt wird, wodurch das Zustandsstörungsproblem jMustache vermieden wird. So würde das JSON-Modell wie folgt aussehen:

{ 
"header": "Colors", 
"items": [ 
     {"caption": "title"}, 
     {"caption": "red", "url": "#Red"}, 
     {"caption": "green", "url": "#Green"}, 
     {"caption": "blue", "url": "#Blue"} 
    ] 
} 

Schließlich müssen Sie Ihre JSON etwas jMustache versteht konvertieren. Ich habe nie die "HTTPFunctions" -Klasse in irgendeiner Bibliothek gesehen oder gehört, die ich benutzt habe, aber ich habe in der Vergangenheit eine ähnliche Zuordnung mit Gson gemacht. Beachten Sie, dass dies eine sehr einfache Implementierung ist, und Sie können es erweitern müssen, um Ihre Bedürfnisse anzupassen:

private Map<String, Object> getModelFromJson(JSONObject json) throws JSONException { 
    Map<String,Object> out = new HashMap<String,Object>(); 

    Iterator it = json.keys(); 
    while (it.hasNext()) { 
     String key = (String)it.next(); 

     if (json.get(key) instanceof JSONArray) { 

      // Copy an array 
      JSONArray arrayIn = json.getJSONArray(key); 
      List<Object> arrayOut = new ArrayList<Object>(); 
      for (int i = 0; i < arrayIn.length(); i++) { 
       JSONObject item = (JSONObject)arrayIn.get(i); 
       Map<String, Object> items = getModelFromJson(item); 
       arrayOut.add(items); 
      } 
      out.put(key, arrayOut); 
     } 
     else { 

      // Copy a primitive string 
      out.put(key, json.getString(key)); 
     } 
    } 

    return out; 
} 

Diese grundlegende JUnit-Test der Theorie zeigt: http://www.pasteshare.co.uk/p/841/

0

Gerade

Map<String, Object> s = HTTPFunctions.toMap(new JSONObject(template)); 
+0

dankt :) aber nun, wie dies konvertieren in HTML-Formatvorlage? – yakusha

+0

Obwohl der Code geschätzt wird, sollte es immer eine begleitende Erklärung haben. Dies muss nicht lange dauern, aber es wird erwartet. – peterh