Hugo技术求助:从含点对象的JSON文件获取数据失败
解决Hugo中获取/data下带点键的JSON数据问题
我碰到好几个Hugo用户都踩过这个带点JSON键的坑——Hugo的模板语法默认会把点当成嵌套对象的分隔符,所以直接用.访问带点的键肯定取不到值。咱们一步步来解决这个问题。
先明确问题根源
假设你的/data/hash.json内容是这样的:
{ "user.fullname": "Daniel", "contact.email": "daniel@example.com", "preferences.theme": "dark" }
如果你在模板里写{{ .Site.Data.hash.user.fullname }},Hugo会尝试去找hash对象下的user属性,再找user下的fullname属性,而不是直接找键为user.fullname的项——这就是为什么你之前的方法失效的核心原因。
两种有效解决方法
方法1:使用index函数(最推荐)
Hugo的index函数可以接收字符串形式的键,完美适配带点的场景。语法非常简单:
{{ index .Site.Data.hash "user.fullname" }}
这样就能直接取出"Daniel"这个值。如果是多层嵌套的带点键(比如JSON里是{"a.b": {"c.d": "hello"}}),可以链式调用index:
{{ index .Site.Data.hash "a.b" "c.d" }}
方法2:遍历所有键值对(适合批量处理)
如果你需要遍历整个JSON对象的所有键值(不管键有没有点),可以用range循环:
{{ range $key, $value := .Site.Data.hash }} <div class="data-item"> <span class="key">{{ $key }}</span> <span class="value">{{ $value }}</span> </div> {{ end }}
这个循环会把每个键(包括带点的user.fullname)和对应的值都渲染出来,完全不会有识别问题。
额外检查项
除了语法问题,还要确认这几点避免踩坑:
- 确保JSON文件放在根目录下的/data文件夹里,文件名是
hash.json(Hugo在Linux环境下区分大小写,注意文件名拼写) - 检查JSON格式是否合法:所有键和字符串值用双引号,逗号分隔正确,没有多余的逗号或语法错误
- 本地开发时可以重启Hugo服务器,确保新的JSON文件被正确加载
这样处理后,你应该就能顺利获取到带点键的JSON数据了。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

