【问题标题】:Printing Java object to Javascript file将 Java 对象打印到 Javascript 文件
【发布时间】:2015-09-25 13:42:14
【问题描述】:

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

控制器会产生输出如

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

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

我想问是否有一种简单、优雅和健壮的方法来将通用 Java 对象编组为 Javascript 表示法。

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

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

注意:

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

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

目前要求不使用 AJAX。如果可以执行“大规模”AJAX 调用,在一次调用中一次检索所有需要的变量,那将是永久的解决方案。

【问题讨论】:

  • 您可以简单地将对象编组为 JSON,然后在从后端输出之前转义所有单引号(使用反斜杠 \)。此时,只需对其调用 JSON.parse 即可。

标签: javascript java web-applications


【解决方案1】:

我发现 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

确定是否使用双引号引用 JSON 对象字段名称的功能,如 JSON 规范所指定的那样。添加了禁用引用的功能,以支持通常不期望出现的用例,这在直接从 Javascript 中使用时最常见。

功能默认启用(因为它是 JSON 规范所要求的)。

这将产生一个绝对不是有效 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..........};

【讨论】:

    【解决方案2】:

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

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

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(new Test());
    
    // Now use json to add it in the custom javascript code
    

    【讨论】:

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