【问题标题】:Jsonix in Google Apps ScriptGoogle Apps 脚本中的 Jsonix
【发布时间】:2018-08-14 15:52:27
【问题描述】:

如何在 Google Apps 脚本(服务器端 Google Docs 自动化)中使用 Jsonix?如果我不能,我可以在 GAS 中使用什么替代 Jsonix 从 XSD 生成 Javascript 映射,然后将 JS 对象序列化为 XML 以提交给 REST API,然后将响应反序列化回 JS 对象?

我使用 Jsonix 将 REST API 从其 XSD 文件编译为 JSON 映射。我在命令行 Node.js 中测试了一个 Javascript,它从内联 JSON 创建一个 JS 对象,然后在 Jsonix.Context 下编组它以提交给 REST API,然后解组响应。

然后我用我的脚本创建了一个 Google Apps 脚本项目。我使用 Jsonix.js 脚本(作为 Jsonix.gs)创建了另一个 GAS 项目,然后使用映射脚本(作为 API.gs)创建了另一个 GAS 项目。我使用 Jsonix 和 API 库的项目密钥配置了我的主脚本的项目资源。我可以执行我的脚本(验证是否使用了库资源),但是在调用 Jsonix.createDocument() 时它会失败。我在 Jsonix 库脚本 _jsonix_factory = function(_jsonix_xmldom, _jsonix_xmlhttprequest, _jsonix_fs) 的开头插入了一个记录 _jsonix_xmldom: undefinedLogger.log("_jsonix_xmldom: " + _jsonix_xmldom) 行,这就是为什么 Jsonix.createDocument() 会抛出错误而不是返回文档。

我可以在 GAS 环境中使用 Google Apps 脚本服务 XmlService 或其他一些服务,而不是 Jsonix 默认期望的 _jsonix_xmldom 吗?或者我可以包含一些功能等效的库作为库资源吗?或者以其他方式在 GAS 中向 Jsonix 提供该功能?

我希望 Jsonix 尝试使用同样未定义的 _jsonix_xmlhttprequest_jsonix_fs 值也会导致类似的错误。我在 Jsonix.js (.gs) 源代码中看到了这两行 // REWORK // Node.js createDocument() 声明和其他地方。也许我报告的这个案例正在积极开发中?

感谢您的见解。

【问题讨论】:

  • 请注意,所有依赖项中的所有全局变量都会针对每个新实例进行评估,因此如果您的项目变得缓慢,这就是原因。服务器实例之间的 Google Apps 脚本没有持久性。

标签: javascript google-apps-script xmldom jsonix


【解决方案1】:

根据 github 上的 jsonix.js 源代码,看起来您必须进行大量工作才能使其在 GAS 中运行。 GAS 环境中根本不存在 XMLDOM 和文档对象,您需要修改 jsonix 以使用 Apps Script 提供的 XmlService 和 UrlFetchApp 服务。

请注意,虽然它看起来很不错,但 jsonix 似乎可以处理不同的环境,而且添加 GAS 支持绝不是不可能的,甚至不是那么困难。

【讨论】:

  • 我的外部 Jsonix 库项目可以通过我的主 GAS 项目的脚本正常访问。 Jsonix 脚本运行。问题是 Jsonix 项目的脚本正在调用 XMLDOM 库上的方法,Jsonix 脚本的包装器工厂函数期望将其作为其环境传递给它的参数接收,但是当环境调用工厂时 GAS 环境没有传递它功能。看起来我必须以某种方式提供 XMLDOM 库。由于图书馆资源对我有用,这种方法似乎是正确的方法。但是作为图书馆资源究竟要实现什么?
  • 对不起,我误解了这个问题,我认为这是一个未定义的 jsonix 中的自引用问题。我将删除或完全重写此答案,因为它不相关。我认为您唯一的选择是重构 jsonix 以使用相关的应用程序脚本服务,这本身可能是一个大项目
  • 我快速浏览了一下jsonix代码并重新编写了这个答案。
【解决方案2】:

我是 Jsonix 的作者。

我不知道“Google Apps 脚本”是什么。当然,这不是“正在积极开发中”的东西。

Jsonix 支持 Node.js 和浏览器环境 OOTB。工厂函数_jsonix_factory 简单地接收期望由环境提供的依赖项。如果不提供依赖项,部分功能将无法使用。

目前有三个依赖:

  • xmldom
  • xmlhttprequest
  • fs

fs 是完全可选的。如果未提供 fs,您将无法使用文件 - 像 unmarshalFile 这样的方法将不起作用。没什么大不了的。

xmlhttprequest 仅当您想从非浏览器环境中的 URL 解析时才需要。没有它,unmarshalURL 将无法工作(在非浏览器环境中)。

xmldom 在非浏览器环境中提供 DOM 解析器。 Jsonix 使用 DOM 解析 XML,因此您需要浏览器提供的 DOM 或提供 xmldom 作为依赖项。这很关键,否则 Jsonix 根本无法工作。

所以基本上你真正真正需要的是xmldom。它将用于:

  • xmldom.DOMImplementation
  • xmldom.XMLSerializer
  • xmldom.DOMParser

有 GAS 的 DOM 实现吗? 如果是,您很可能能够将其作为依赖项传递给_jsonix_factory。 如果没有,对不起,什么都做不了。

【讨论】:

    【解决方案3】:

    我最终为 Jsonix、它的 XMLDOM 依赖项以及我使用 Jsonix 从 API 的 XSD 文件生成的 API 映射 JS (GAS) 创建了新的 Google Apps 脚本项目。我使我的 GAS Jsonix 项目依赖于我的 XMLDOM 项目作为库资源。然后我为我的主脚本做了一个 GAS 项目,它依赖于 Jsonix GAS 项目和 API GAS 项目作为库资源。它有效。

    我使用了一个现有的、经过良好测试的 XMLDOM 项目,并带有适当的 FOSS 许可证,并对其进行了调整以适应 GAS API 要求。

    我尝试使用 GAS XmlService,包装其 API 以将其相关成员呈现为 DOMImplementation、DOMParser 和 XMLSerializer,但 XmlService API 与 XMLDOM API 严重不一致。与标准 DOM 实现相对应的 XmlService API 成员的结构与标准 API 完全不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多