为某些类似的键编写yml时出错

时间:2017-11-21 09:59:11

标签: spring yaml

我有两个键 - app.user =' user1'和app.user.age =' 21' 。我需要在yml文件中写这些。当我写这些时,我会收到错误 -

1) app:
    user: 'user1'
    age: '21'

错误:此处不允许映射值

2) app: 
    user: 'user1'
   app:
    user:
      age:'21'
error: **duplication error**

1 个答案:

答案 0 :(得分:1)

如果我们假设符号x.yy引用的映射中具有语义 x的值,那么您的数据模型在解释为YAML数据时会自相矛盾。 。请注意,此表示法未在YAML中定义。基于这个假设,这就是矛盾:

app.user = 'user1'        (1)
app.user.age= '21'        (2)

声明(1)表示:

  

app 的值是映射。此映射包含一个键用户,其值为内容为user1的标量。

声明(2)表示:

  

app 的值是映射。此映射包含一个键用户,其值也是映射。在该映射中,有一个键 age ,其值为21

矛盾显而易见:app.user不能是声明(1)暗示的标量值和声明(2)同时隐含的映射。所以解决方案显然是从数据模型中消除矛盾。一种可行的方法是:

app:
  user:
    id: 'user1'
    age: '21'

至于重复错误:YAML禁止映射包含相等的键。在您的代码中,根映射中有两个键app,这会导致错误。

注意:

我知道数据序列化,允许密钥同时具有简单的复杂值。我只能猜测你从那里得到了你的模型的想法。它本身并不是错误的,只是不受YAML的支持。 Boost的INFO文件格式就是其中一种格式。

修改

如果你不同意我上面关于x.y的语义的假设,你可能来自Java地,java.langjava.util除了名字之外完全没有任何关系具有相同的前缀。最重要的是,它们是包java子包(​​如果令您感到惊讶,请阅读docs中的包的显式层次结构部分)。

遵循此语义,您的数据中没有层次结构,因此您的YAML中没有层次结构。而不是编写嵌套映射,你会写:

app.user: 'user1'
app.user.age: '21'

请注意,.不是特殊的YAML字符,而只是值键的一部分。