application.yml 里的国家代码 NO 为什么变成 false?邮编 01234 为什么变成 668?tab、冒号后没空格、重复 key 各报什么错?哪些值必须加引号?这篇把每一种写法在 Spring Boot 4.0.8 里读一遍。
YAML 内容:app: ⏎ country: NO ⏎ answer: yes ⏎ switch: on ⏎ quoted: "no" ⏎ upper: No ⏎ word: nope ⏎ app.country → 字符串 "false",YAML 解析出的对象类型 Boolean app.answer → 字符串 "true",YAML 解析出的对象类型 Boolean app.switch → 字符串 "true",YAML 解析出的对象类型 Boolean app.quoted → 字符串 "no",YAML 解析出的对象类型 String app.upper → 字符串 "false",YAML 解析出的对象类型 Boolean app.word → 字符串 "nope",YAML 解析出的对象类型 String 这个文件里一共解析出的属性名:[app.answer, app.country, app.quoted, app.switch, app.upper, app.word]
被解析成布尔值。
YAML 内容:app: ⏎ zip: 01234 ⏎ octal: 010 ⏎ version: 1.10 ⏎ big: 1_000 ⏎ hex: 0x1F ⏎ expo: 1e3 ⏎ quotedzip: "01234" ⏎ app.zip → 字符串 "668",YAML 解析出的对象类型 Integer app.octal → 字符串 "8",YAML 解析出的对象类型 Integer app.version → 字符串 "1.1",YAML 解析出的对象类型 Double app.big → 字符串 "1000",YAML 解析出的对象类型 Integer app.hex → 字符串 "31",YAML 解析出的对象类型 Integer app.expo → 字符串 "1000.0",YAML 解析出的对象类型 Double app.quotedzip → 字符串 "01234",YAML 解析出的对象类型 String 这个文件里一共解析出的属性名:[app.big, app.expo, app.hex, app.octal, app.quotedzip, app.version, app.zip]
前导 0、1.10、0x、1e3 都被改写。
YAML 内容:app: ⏎ <tab>name: demo ⏎ 启动失败:ScannerException:while scanning for the next token / found character '\t(TAB)' that cannot start any token. (Do not use \t(TAB) for indentation)
ScannerException。
YAML 内容:app: ⏎ name:demo ⏎ port: 80 ⏎ 启动失败:ScannerException:mapping values are not allowed here / in 'reader', line 3, column 7: -- 只有这一行(后面没有别的行) YAML 内容:app: ⏎ name:demo ⏎ app → 字符串 "name:demo",YAML 解析出的对象类型 String app.name → 字符串 (没有这个属性) 这个文件里一共解析出的属性名:[app]
有时报错,有时悄悄配错。
YAML 内容:app: ⏎ name: a ⏎ name: b ⏎ 启动失败:DuplicateKeyException:while constructing a mapping / in 'reader', line 2, column 3:
DuplicateKeyException。
YAML 内容:app: ⏎ msg: hello: world ⏎ 启动失败:ScannerException:mapping values are not allowed here / in 'reader', line 2, column 13: -- 值以 * 开头 YAML 内容:app: ⏎ pattern: *.jar ⏎ 启动失败:ScannerException:while scanning an alias / in 'reader', line 2, column 12: -- 值以 @ 开头 YAML 内容:app: ⏎ user: @demo@ ⏎ 启动失败:ScannerException:while scanning for the next token / found character '@' that cannot start any token. (Do not use @ for indentation) -- 三个值都加了双引号 YAML 内容:app: ⏎ msg: "hello: world" ⏎ pattern: "*.jar" ⏎ user: "@demo@" ⏎ app.msg → 字符串 "hello: world",YAML 解析出的对象类型 String app.pattern → 字符串 "*.jar",YAML 解析出的对象类型 String app.user → 字符串 "@demo@",YAML 解析出的对象类型 String 这个文件里一共解析出的属性名:[app.msg, app.pattern, app.user]
冒号加空格、*、@ 开头。
YAML 内容:app: ⏎ empty: ⏎ tilde: ~ ⏎ emptystr: "" ⏎ nullword: null ⏎ app.empty → 字符串 "",YAML 解析出的对象类型 String app.tilde → 字符串 "",YAML 解析出的对象类型 String app.emptystr → 字符串 "",YAML 解析出的对象类型 String app.nullword → 字符串 "",YAML 解析出的对象类型 String 这个文件里一共解析出的属性名:[app.empty, app.emptystr, app.nullword, app.tilde]
四种写法都是空字符串。
YAML 内容:app: ⏎ a: [x, y] ⏎ b: ⏎ - p ⏎ - q ⏎ c: x, y ⏎ app.a[0] → 字符串 "x",YAML 解析出的对象类型 String app.a[1] → 字符串 "y",YAML 解析出的对象类型 String app.b[0] → 字符串 "p",YAML 解析出的对象类型 String app.b[1] → 字符串 "q",YAML 解析出的对象类型 String app.c → 字符串 "x, y",YAML 解析出的对象类型 String 这个文件里一共解析出的属性名:[app.a[0], app.a[1], app.b[0], app.b[1], app.c]
方括号与短横线写法展开成下标属性。