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

Printing JSON object from javascript function on glassfish server log

本文关键字:函数 打印 JSON 对象 javascript glassfish 服务器 日志      更新时间:2023-09-26

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

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

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

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

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

如果你想使用JSON.stringify,它给出了未定义的,这意味着JSON是未定义的还是只是函数?如果是这样的话,那可能是Nashorn的盒子里没有。也许可以尝试将其添加为polyfill:您可以在此处或此处查看。

如果您在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 Rhino js引擎的唯一解决方案。

如果您有数字,那么您可能需要在new Number()构造函数中包装java对象。

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