Доступ к родному Rhino JSON.Stringify из Java

Есть ли более чистый способ получить JSON-представление объекта Javascript, чем с помощью следующего кладжа?

System.out.println(((ScriptableObject) scope).callMethod(
    cx, (Scriptable) scope.get("JSON", scope), 
    "stringify", new Object[]{jsObject}));

Где jsObject — это ScriptableObject, который я хочу преобразовать в строку.


person ironchefpython    schedule 23.04.2012    source источник


Ответы (2)


Обратите внимание, что Ханнес устранил эту проблему в Rhino. Таким образом, использование упрощается до этого:

import org.mozilla.javascript.NativeJSON;
// ...

Object json = NativeJSON.stringify(cx, scope, jsObject, null, null);

Класс org.mozilla.javascript.NativeJSON должен быть общедоступным в выпуске Rhino 1.7R4.

person Tim Schaub    schedule 31.05.2012
comment
Я хотел бы использовать вышеизложенное, но я не могу понять, как получить область действия из тега Ant/Rhino/Script. Контекст кажется доступным через .getCurrentContext(), но не уверен в области действия. - person Joel; 30.08.2013

Мне удалось заставить это работать в целевом объекте Apache Ant, используя класс NativeJSON.

importPackage(org.mozilla.javascript);

var context = Context.enter();
var json = '{}';
// The call to parse required a reviver function that should return the
// state of a key/value pair.
var reviver = function(key, value) { return value; };
var scope = context.initStandardObjects();
var object = NativeJSON.parse(context, scope, json, reviver);

// The call to stringify does not require the replacer or space parameters.
// The replacer is a function that takes a key/value pair and returns the
// new value or an array of keys from the input JSON to stringify. The space
// parameter is the indentation characters or length.
json = NativeJSON.stringify(context, scope, config, null, 4);

http://mozilla.github.io/rhino/javadoc/org/mozilla/javascript/NativeJSON.html https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/NativeJSON.java

person Trevor Karjanis    schedule 27.09.2017