Java Stringtemplate:可以将HashMap使用的模板应用于多值属性吗
在我的.stg文件中有两个模板,它们都适用于 多值哈希映射。HashMap用作注入对象 我需要那些HashMap的实例可以被注入很多次 我的问题是,当我切换到另一个模板时,ANTLR似乎 将第二个哈希映射视为一个列表——多PUL对象和NULL 价值观Java Stringtemplate:可以将HashMap使用的模板应用于多值属性吗,java,hashmap,stringtemplate,Java,Hashmap,Stringtemplate,在我的.stg文件中有两个模板,它们都适用于 多值哈希映射。HashMap用作注入对象 我需要那些HashMap的实例可以被注入很多次 我的问题是,当我切换到另一个模板时,ANTLR似乎 将第二个哈希映射视为一个列表——多PUL对象和NULL 价值观 我预期的结果是: bar: Kant @ German foo: Russell @ England 但是,我得到了: foo: NULL . NULL foo: NULL . NULL bar: @ bar: @ 如果我们用F
我预期的结果是:
bar: Kant @ German
foo: Russell @ England
但是,我得到了:
foo: NULL . NULL
foo: NULL . NULL
bar: @
bar: @
如果我们用FOO替换BAR,保持FOO和BAR相同 模板,输出是正确的,如下所示
bar: Russell @ German
bar: Russell @ German
在文档中,在 org.stringtemplate.v4.ST”说: 如果您发送一个列表,然后注入一个值元素,则添加() 复制原始列表并添加新值。“ 哈希映射呢?StrugType是否考虑哈希图、键值对 访问,一个有目的的对象,作为列表和多值注入
错误?您的问题是将foo/bar模板应用于地图中的每个项目,而不是地图本身 考虑以下数据结构:
{
"FOO": {
"name": "Nick",
"national":"German"
},
"BAR": {
"name": "Karl",
"national":"French"
},
"FIZZBUZZ": [
{
"name": "Kitty",
"national":"English"
},
{
"name": "Dan",
"national":"Finnish"
}
]
}
(假设您已将FOO设置为结果图、FIZZBUZZ等)
想象一下以下模板:
group blank;
main()::=<<
$foo(nn=FOO)$
$bar(mm=BAR)$
$! This is wrong because it applies foo to each element of the map!$
$FOO:foo(); separator = "\n"$
$! This is right because each element of baz is itself a map! !$
$FIZZBUZZ:foo(); separator = "\n"$
$FIZZBUZZ:bar(); separator = "\n"$
>>
foo(nn) ::= <<
foo: $nn.name; null="NULL"$ . $nn.national; null="NULL"$
>>
bar(mm) ::= <<
bar: $mm.name$ @ $mm.national$
>>
因此,只需将调用从FOO:FOO()
更改为FOO(nn=FOO)
我使用了我开发的StringTemplate应用程序引擎项目(http://stringtemplate.appspot.com/)检验这一点;我想它不是使用4.0版,而是3.2版,但应该非常类似。您的问题是,您将foo/bar模板应用于地图中的每个项目,而不是地图本身 考虑以下数据结构:
{
"FOO": {
"name": "Nick",
"national":"German"
},
"BAR": {
"name": "Karl",
"national":"French"
},
"FIZZBUZZ": [
{
"name": "Kitty",
"national":"English"
},
{
"name": "Dan",
"national":"Finnish"
}
]
}
(假设您已将FOO设置为结果图、FIZZBUZZ等)
想象一下以下模板:
group blank;
main()::=<<
$foo(nn=FOO)$
$bar(mm=BAR)$
$! This is wrong because it applies foo to each element of the map!$
$FOO:foo(); separator = "\n"$
$! This is right because each element of baz is itself a map! !$
$FIZZBUZZ:foo(); separator = "\n"$
$FIZZBUZZ:bar(); separator = "\n"$
>>
foo(nn) ::= <<
foo: $nn.name; null="NULL"$ . $nn.national; null="NULL"$
>>
bar(mm) ::= <<
bar: $mm.name$ @ $mm.national$
>>
因此,只需将调用从FOO:FOO()
更改为FOO(nn=FOO)
我使用了我开发的StringTemplate应用程序引擎项目(http://stringtemplate.appspot.com/)检验这一点;我想它不是使用4.0版,而是3.2版,但应该非常类似。您标记并提到了ANTLR,但我没有看到关于ANTLR(仅StringTemplate)的问题。因此,我删除了ANTLR标签,并将提及的“ANTLR”替换为“StringTemplate”。如果我错了,您可以返回到原始问题,但请编辑该问题以明确什么是ANTLR问题。您标记并提到了ANTLR,但我没有看到关于ANTLR的问题(仅StringTemplate)。因此,我删除了ANTLR标签,并将提及的“ANTLR”替换为“StringTemplate”。如果我错了,你可以回到你原来的问题,但请编辑问题,以明确什么是ANTLR问题。
foo: Nick . German
bar: Karl @ French
foo: NULL . NULL
foo: NULL . NULL
foo: Kitty . English
foo: Dan . Finnish
bar: Kitty @ English
bar: Dan @ Finnish