Mustache-Java:如何通过键获取Map中的值

时间:2017-08-20 23:12:24

标签: java mustache

我在Java中使用JMustache。

我的Mustache模板中有Map变量。我如何获取地图中特定键的值,就像我们在Java中一样(map.get())。

我知道如何在模板中迭代Map的键和值。但我想要一个没有迭代的解决方案,以便我可以评估一个表达式,如:

数据

{
    "cities": [
        {
            "Tokyo": {
                "overview": {
                    "population": "19000000",
                    "area": "450000"
                }
            }
        },
        {
            "Sydney": {
                "overview": {
                    "population": "4500000",
                    "area": "6250000"
                }
            }
        }
    ]
}

模板

"The population of Tokyo is: {{cities['Tokyo'].overview.population}}"

1 个答案:

答案 0 :(得分:0)

首先,您的胡子语法存在问题。 cities['Tokyo']无效。 cities是一个数组。您可以遍历数组,但不能根据其键值(或任何其他条件)选择元素。

所以这个JSON对象更适合:

{
    "cities": {
        "Tokyo": {
            "overview": {
                "population": "19000000",
                "area": "450000"
            }
        },
        "Sydney": {
            "overview": {
                "population": "4500000",
                "area": "6250000"
            }
        }
    }
}

其次,您必须使用StringMap对象将JSON List解析为结构。大多数JSON解析器都能够执行此操作。在此示例中,我使用noggit

@Test
public void testSO_45787572() throws IOException {
    final String json = 
        "{\n" +
        "   \"cities\": {\n" +
        "       \"Tokyo\": {\n" +
        "           \"overview\": {\n" +
        "               \"population\": \"19000000\",\n" +
        "               \"area\": \"450000\"\n" +
        "           }\n" +
        "       },\n" +
        "       \"Sydney\": {\n" +
        "           \"overview\": {\n" +
        "               \"population\": \"4500000\",\n" +
        "               \"area\": \"6250000\"\n" +
        "           }\n" +
        "       }\n" +
        "   }\n" +
        "}";
    assertEquals("The population of Tokyo is: 19000000", Mustache.compiler()
        .compile(new StringReader("The population of Tokyo is: {{cities.Tokyo.overview.population}}"))
        .execute(new ObjectBuilder(new JSONParser(json)).getObject())
    );
}