2013-03-21 27 views
5

Tôi đang sử dụng mã này dưới đây để nhập dữ liệu JSON vào một khuôn mẫu, để có được HTML:Hãy Moustache Template, vượt qua JSON và Chuyển đổi sang HTML

mẫu:

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 đối tượng:

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. 
} 

Tôi chuyển bản đồ dữ liệu để Mustache hoạt động. Phương pháp này trông giống như sau:

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; 
} 

Tôi đang theo dõi Mustache Guide để có được tính năng tự động sửa Mustache. Nhưng tôi không biết làm thế nào để có được kết quả mà tôi mong đợi. Đầu ra phải được như sau:

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

Trả lời

1

tôi nghĩ rằng bạn cần phải suy nghĩ lại mẫu Moustache của bạn một chút. Thư viện jMustache (mà tôi giả sử bạn đang sử dụng) dường như luôn đối xử với {{# thực thể như các danh sách và lặp nội dung, không phụ thuộc vào kiểu dữ liệu thông qua vào

Something như thế này nên làm việc:.

này sẽ tạo ra một neo HMTL chỉ khi một giá trị "liên kết" được cung cấp, do đó tránh jMustache nếu vấn đề điều kiện. Vì vậy, mô hình JSON sẽ trông giống như sau:

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

Cuối cùng, bạn sẽ cần phải chuyển đổi JSON của bạn thành một cái gì đó mà JMustache hiểu được. Tôi đã không bao giờ nhìn thấy hoặc nghe nói về các lớp "HTTPFunctions" trong bất kỳ thư viện tôi đã sử dụng, nhưng tôi đã thực hiện một số bản đồ tương tự bằng cách sử dụng Gson trong quá khứ. Lưu ý rằng đây là một thực hiện rất đơn giản và bạn có thể cần phải mở rộng nó để phù hợp với nhu cầu của bạn:

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; 
} 

thử JUnit cơ bản này cho thấy lý thuyết: http://www.pasteshare.co.uk/p/841/

0

Chỉ cần sử dụng

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

cảm ơn bạn :) nhưng bây giờ làm thế nào để chuyển đổi này vào định dạng html mẫu? – yakusha

+0

Mặc dù mã được đánh giá cao, nó luôn luôn nên có một lời giải thích kèm theo. Điều này không phải là dài nhưng nó được mong đợi. – peterh