You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gulp+Pug生成JSON-LD时,如何处理@符号字段?

解决Pug编译JSON-LD时@符号的问题

我之前也碰到过类似的情况——Pug的@符号是内置指令的前缀,直接写肯定会被解析成指令,而不是JSON键的一部分。结合你用Gulp+gulp-pug+gulp-xml2json的流程,给你几个简单可行的方案:

方案一:跳过XML中间步骤,直接用Pug生成JSON

这是最直接的解决方法,完全避开XML的限制,也不用纠结@符号的解析问题。

在你的Pug文件(比如命名为data.json.pug)里,用JavaScript构造JSON-LD对象,再通过JSON.stringify输出:

- // 先定义JSON-LD数据
- const jsonLd = {
  "@context": "https://schema.org",
  "@type": "WebPage",
  "url": "https://your-site.com",
  "name": "Your Page Title"
};
- // 输出格式化后的JSON
= JSON.stringify(jsonLd, null, 2)

然后调整Gulp任务,直接用gulp-pug编译成JSON文件,去掉gulp-xml2json的步骤:

const gulp = require('gulp');
const pug = require('gulp-pug');

gulp.task('build-jsonld', () => {
  return gulp.src('src/data.json.pug')
    .pipe(pug({ pretty: false })) // pretty设为false避免多余格式
    .pipe(gulp.dest('dist'));
});

这种方式下,@符号是作为JavaScript对象的键存在的,Pug不会把它当成指令,完美输出你需要的JSON-LD结构。

方案二:保留XML流程的适配方案

如果你的项目必须依赖XML转JSON的流程,那得调整XML的写法,因为XML标签不能包含@符号,我们可以用属性来存储带@的键名:

先修改你的data.json.xml.pug文件,用带key属性的item元素来定义键值对:

root
  item key="@context" value="https://schema.org"
  item key="@type" "Article"
  item key="headline" "Your Article Headline"

然后在Gulp任务里,给gulp-xml2json加一个自定义转换函数,把XML结构转换成带@符号的JSON:

const gulp = require('gulp');
const pug = require('gulp-pug');
const xml2json = require('gulp-xml2json');

gulp.task('xml-to-jsonld', () => {
  return gulp.src('src/data.json.xml.pug')
    .pipe(pug()) // 编译成XML
    .pipe(xml2json({
      explicitArray: false,
      transform: (xmlObj) => {
        const jsonLd = {};
        // 遍历所有item,把key属性作为JSON键,value属性/文本作为值
        xmlObj.root.item.forEach(item => {
          const key = item.$.key;
          jsonLd[key] = item.$.value || item._;
        });
        return jsonLd;
      }
    }))
    .pipe(gulp.dest('dist'));
});

为什么之前的插值无效?

Pug里的@是语法关键字,用于@each、@if这类指令,直接写@context会被Pug当成指令解析,而不是文本内容。只有把@放在字符串(比如JS对象的键)里,或者通过转义、JS输出的方式,才能让Pug把它当成普通字符处理。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:36