将 Java 对象打印到 Java 脚本文件

Printing Java object to Javascript file

我需要从 MVC 应用程序生成一个 Java 脚本文件,其中包含 Java 脚本(基于 Angular 的)框架所需的一些变量。

控制器会产生如下输出

var currentUser = {userId: "jdoe", firstname: "John", lastname: "Doe"};
var somethingElse = [];

在您询问是否可以从 AJAX 调用中检索该信息之前,我要说的是,目前还不可能。

我想问一下是否有一种简单、优雅且可靠的方法来将通用 Java 对象编组为 Java 脚本表示法。

到目前为止,我已尝试利用 JSON,但结果难读且不可靠

printWriter.println(MessageFormat.format("var currentUser = JSON.parse(''{0}'');", objectMapper.writeValueAsString(user)));

注意事项:

  1. JSON 语法会引用属性名称,而 Javascript 不会。 JSON 和 Java 脚本相似但不同。所以我需要解析 JSON 而不是写整个 JSON
  2. JSON 允许单引号 ' 但是使用这样的语法 Java 脚本会截断字符串,所以我需要转义单引号
  3. 在我转义引号后,我不知道其他可能的陷阱

所以我想问一下是否有更简单的方法以更健壮但更智能的方式将这样的对象编组到 Java脚本中。

不使用 AJAX 是目前的要求。当可以执行一个 "massive" AJAX 调用,在一次调用中一次检索所有需要的变量时,这将是永久的解决方案。

使用标准库来做到这一点。

您可以将 java 对象转换为 json 字符串(例如使用 jackson)。然后你需要使用这个字符串将它添加到一段java脚本代码中。

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new Test());

// Now use json to add it in the custom javascript code

我发现 Jackson 能够从输出中删除双引号 JSON

final ObjectMapper objectMapper = new ObjectMapper().configure(Feature.QUOTE_FIELD_NAMES, false);
pw.println(MessageFormat.format("var currentUserInfo = {0};", objectMapper.writeValueAsString(user)));

来自docs

QUOTE_FIELD_NAMES

public static final JsonGenerator.Feature QUOTE_FIELD_NAMES

Feature that determines whether JSON Object field names are quoted using double-quotes, as specified by JSON specification or not. Ability to disable quoting was added to support use cases where they are not usually expected, which most commonly occurs when used straight from Javascript.

Feature is enabled by default (since it is required by JSON specification).

这将产生一个绝对 不是 有效 JSON 的输出,但是正如问题中所述,我对 JSON 不感兴趣。

在这种情况下,理论上不需要转义单引号。

输出符合预期

var currentUserInfo = {username:"root",completeName:"Administrator",email:null,locale:"it_IT",accountExpirationDate:null,passwordExpirationDate:null,passwordChangeable:false,creationDate:null,lastLogin:null,status:null..........};