2017-05-12 12 views
2

JavaScript 객체를 Nashorn (Java 8)을 사용하여 Javascript 함수에 전달해야하는 String 형식 (실제로 데이터베이스에서 가져 오는 JavaScript 객체)이 있습니다. 엔진은 전달 된 매개 변수를 자바 스크립트에서 문자열로 취급합니다. Javascript 객체로 식별하고 싶습니다.Nashorn을 사용하여 Javascript Object를 Java에서 Javascript로 전달하는 방법

String script = "function genData(dataModel) { return 'hello world '+ dataModel.url.value + ' done'; }"; 

//"{url : {value : "abc.com",type : "string"},layout : {value : "",type : "string"}}"; 

String dataModel = "{url : {value : \"abc.com\",type : \"string\"},layout : {value : \"\",type : \"string\"}}"; 

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("JavaScript"); 
Invocable inv = (Invocable) engine; 
result = inv.invokeFunction("genData", dataModel); 

내가 오류는 다음과 같습니다 :
javax.script.ScriptException : 형식 오류 : "값을"속성을 읽어 줄 번호 1

+0

당신의 데이터 모델 리터럴 유효한 문자열 .... –

+0

잘 생각이 어떻게 자바 스크립트 객체를 보여주고 있었다 아니다 외모가 생기지 않아 덜 위험 해집니다. 주석으로 옮기고 문자열이 이스케이프 처리되면 도움이됩니다. – iqz

답변

1

에서 정의되지 않은에서 할 수 없습니다 아래

는 코드입니다 함수 자체 나 다른 곳에서 dataModel 문자열을 JSON으로 먼저 변환 한 다음 전달할 수 있습니다.

예 : 당신의 데이터 모델은 간단한 자바 Map입니다

String dataModel = ...; 
// convert the string as a JSON object 
engine.put("dataModel", dataModel); 
JSObject obj = (JSObject)engine.eval("JSON.parse(dataModel)"); 
... 
// dataModel is a script object - as it is a result of JSON.parse 
// pass it as parameter for genData 
inv.invokeFunction("genData", obj); 
0

경우 직접 매개 변수로 invokeFunction에 전달할 수 있습니다. 고급 사용을 위해서는 매개 변수가 Bindings 인터페이스를 구현해야합니다.

Example :

이 쉽게 나는 도서관이 json라고 썼다 만들려면

Json j = new Json("a", 5); 
    Double result = (Double) eng.eval("a+1", j);