如何在Android上使用JSON / String执行Mustache模板?

时间:2012-09-07 09:16:51

标签: java android json string mustache


我有String对象与模板库,如:

<h1>{{header}}</h1>
{{#bug}}
{{/bug}}

{{#items}}
  {{#first}}
    <li><strong>{{name}}</strong></li>
  {{/first}}
  {{#link}}
    <li><a href="{{url}}">{{name}}</a></li>
  {{/link}}
{{/items}}

{{#empty}}
  <p>The list is empty.</p>
{{/empty}}

我想拉出代表String的另一个JSONObject对象并将其字段放入模板中:

{
  "header": "Colors",
  "items": [
      {"name": "red", "first": true, "url": "#Red"},
      {"name": "green", "link": true, "url": "#Green"},
      {"name": "blue", "link": true, "url": "#Blue"}
  ],
  "empty": false
}

最后,我会得到代表HTML结构的String

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

我不想使用任何POJO或Map s - 仅使用标准String个对象,或者将第二个String转换为JSONObject以将其用作模板上下文。
有人能给我一个如何实现这个目标的例子吗?
谢谢。

修改:执行模板时我对模板/ JSON结构一无所知 - 我必须使用未知模板/ JSON并假设它们是正确的

1 个答案:

答案 0 :(得分:1)

我无法找到处理纯String个对象的方法 - 我正在将JSONObject转换为Map以使其与Mustache一起使用。这是转换代码:

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

public static List toList(JSONArray array) throws JSONException
{
    List list = new ArrayList();
    for (int i = 0; i < array.length(); i++)
    {
        list.add(fromJson(array.get(i)));
    }
    return list;
}

private static Object fromJson(Object json) throws JSONException
{
    if (json instanceof JSONObject)
    {
        return toMap((JSONObject) json);
    } else if (json instanceof JSONArray)
    {
        return toList((JSONArray) json);
    } else
    {
        return json;
    }
}

用法:

mustacheTemplate.execute(JSONUtils.toMap(new JSONObject(myString)));