Java Stringtemplate:可以将HashMap使用的模板应用于多值属性吗

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

在我的.stg文件中有两个模板,它们都适用于 多值哈希映射。HashMap用作注入对象

我需要那些HashMap的实例可以被注入很多次

我的问题是,当我切换到另一个模板时,ANTLR似乎 将第二个哈希映射视为一个列表——多PUL对象和NULL 价值观



我预期的结果是:

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