1


我有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
}

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

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

我不想使用任何 POJO 或Maps - 仅使用标准String对象或将第二个String转换为JSONObject以将其用作模板的上下文。
有人能给我举个例子吗?
谢谢。

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

4

1 回答 1

1

我找不到处理纯String对象的方法 - 我正在转换JSONObjectMap让它与 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)));
于 2012-09-13T11:31:25.380 回答