将Java对象打印到Javascript文件

时间:2015-09-25 13:42:15

标签: javascript java web-applications

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

控制器将产生输出,如

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. 在我逃脱报价之后,我不知道其他可能的陷阱
  4. 所以我想问一下,是否有一种更简单的方法可以以更强大但更智能的方式将这样的对象编组到Javascript中。

    目前不要使用AJAX。什么时候可以进行大规模的" AJAX调用,在一次调用中一次性检索所有需要的变量,这将是永久解决方案。

2 个答案:

答案 0 :(得分:0)

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

您可以将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

答案 1 :(得分:0)

我发现自己杰克逊能够从输出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..........};