5

以下のコードを使用して、JSONデータをテンプレートにマージし、HTMLを取得しています。

レンプレート:

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オブジェクト:

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

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

私は口ひげの自動形成を得るために口ひげガイドに従っています。しかし、私は私が期待している結果を得る方法がわかりません。出力は次のようになります。

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

2 に答える 2

1

Mustacheテンプレートを少し考え直す必要があると思います。jMustacheライブラリ(私はあなたが使用していると思います)は{{#、渡されたデータ型に関係なく、常にエンティティをリストとして扱い、その内容を反復するようです。

このようなものが機能するはずです:

<h1>{{header}}</h1>
{{#items}}
<li>
    {{#url}}<a href="{{.}}">{{/url}}
    {{^url}}<strong>{{/url}}
        {{caption}}
    {{#url}}</a>{{/url}}
    {{^url}}</strong>{{/url}}
</li>
{{/items}}
{{^items}}
    <p>The list is empty.</p>
{{/items}}

これにより、「リンク」値が指定されている場合にのみHMTLアンカーが生成されるため、jMustacheif条件の問題が回避されます。したがって、JSONモデルは次のようになります。

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

最後に、JSONをjMustacheが理解できるものに変換する必要があります。使用したライブラリで「HTTPFunctions」クラスを見たり聞いたりしたことはありませんが、過去にGsonを使用して同様のマッピングを行ったことがあります。これは非常に単純な実装であり、ニーズに合わせて拡張する必要がある場合があることに注意してください。

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

この基本的なJUnitテストは、理論を示しています。http: //www.pasteshare.co.uk/p/841/

于 2013-03-21T11:55:03.563 に答える
0

使用するだけ

Map<String, Object> s =  HTTPFunctions.toMap(new JSONObject(template));
于 2013-03-21T10:50:15.453 に答える