场景:在glassfish 4.1 / jdk1.8.45上运行的Java servlet。有一个从数据库读取的javascript函数,并使用javax.script。*在服务器端执行。在尝试调试此函数时,需要在服务器日志上输出一些json对象。它使用JSON.stringify()打印[Object object]而不是实际的JSON.Tried,它给出[undefined]。 有没有办法在这种情况下打印json对象上的实际内容? 感谢。
答案 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没有把它放在盒子里。也许可以尝试将其添加为填充:您可以查看here或here。
答案 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