从glassfish服务器日志上的javascript函数打印JSON对象

时间:2016-07-29 20:26:25

标签: javascript java json nashorn

场景:在glassfish 4.1 / jdk1.8.45上运行的Java servlet。有一个从数据库读取的javascript函数,并使用javax.script。*在服务器端执行。在尝试调试此函数时,需要在服务器日志上输出一些json对象。它使用JSON.stringify()打印[Object object]而不是实际的JSON.Tried,它给出[undefined]。 有没有办法在这种情况下打印json对象上的实际内容? 感谢。

3 个答案:

答案 0 :(得分:1)

JSON.stringify仅适用于javascript对象。它不适用于Java对象。请确保您在JavaScript对象上调用JSON.stringify。

如果确实需要在java对象上创建JSON字符串,可以使用Object.bindProperties扩展名(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-Object.bindProperties)将Java对象的属性绑定到脚本对象,然后在其上调用JSON.stringify

示例(测试)代码在这里 - > http://hg.openjdk.java.net/jdk9/dev/nashorn/file/0de67a63e2c7/test/script/nosecurity/treeapi/utils.js

此脚本用于将Nashorn AST树对象[Java对象]转换为友好的JSON对象。

答案 1 :(得分:0)

如果你想使用JSON.stringify并且它提供了未定义的,它是否意味着JSON未定义或只是函数? 如果是这样,可能是Nashorn没有把它放在盒子里。也许可以尝试将其添加为填充:您可以查看herehere

答案 2 :(得分:0)

如果您在Nashorn脚本引擎中处理字符串,则很有可能它们是Java字符串而不是javascript字符串。解决方法是将Java字符串转换为Javascript字符串。

// this string does not work with stringify()
var javaString = someMethodReturningAJavaString();

var jsString = new String(javaString);

// now stringify() works:
var myJson = JSON.stringify({'key': jsString});

如果typeof(new String(javaString))返回object而不是string,则使用new String(javaString).valueOf()。对于某些值,这似乎是Mozilla's Rhino js engine的唯一解决方案。

如果有数字,则可能需要将Java对象包装在new Number()构造函数中。

有关Nashorn引擎的详细信息,请查看https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/javascript.html