2014-01-17 1 views
2

Я хотел бы передать полный объект JSON для адаптера java в рабочем свете. Этот адаптер вызовет несколько других удаленных ресурсов для выполнения запроса. Я хотел бы передать структуру json вместо того, чтобы перечислять все параметры по ряду причин. Вызов процедуры подсветки хорошо работает. В качестве параметра передаю следующее:Передача объекта JSON для адаптера java для рабочего света

{ "parm1": 1, "parm2" : "hello" } 

Какой инструмент в порядке. Когда он вызывает мой java-код, я вижу, что передается тип объекта JSObjectConverter $ 1. В java debug я могу видеть значения в объекте, но я не вижу никакой документации о том, как это сделать. Если мне помогает память, $ 1 говорит, что это анонимный внутренний класс, который передается. Есть ли лучший способ передать объект/структуру json в адаптерах?

+0

Просто передавая его как строку и используя любое из множества библиотек JSON, доступных для Java, вы будете прекрасно: https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java – Zarathuztra

ответ

0

Чтобы лучше объяснить, что я делаю здесь, я хотел бы быть в состоянии пройти объекты JavaScript в адаптер и он вернуть обновленный объект JavaScript. Похоже, есть два пути. Первое, на что я ответил несколько дней назад, с сериализацией и нессериализацией javascript-объекта. Другой использует класс ScriptableObject. В конце концов я хотел использовать инфраструктуру адаптера, как описано для передачи в объекте javascript. При этом, это то, что адаптер код JS-осущ выглядит следующим образом:

function add2(a) { 
return { 
    result: com.ibm.us.roberso.Calculator.add2(a) 
}; 

В яваскрипте кода клиентского приложения, вызывающем выше адаптер. Обратите внимание, что у меня есть функция для проверки передачи объекта javascript в качестве параметра в инфраструктуру адаптера. Смотрите приведенные ниже invocationData.parameters:

function runAdapterCode2() { 
// x+y=z 
var jsonObject = { "x": 1, "y" : 2, "z" : "?" }; 

var invocationData = { 
    adapter : "CalculatorAdapter", 
    procedure : 'add2', 
    parameters : [jsonObject] 
}; 

var options = { 
    onSuccess : success2, 
    onFailure : failure, 
    invocationContext : { 'action' : 'add2 test' } 
}; 

WL.Client.invokeProcedure(invocationData, options); 
} 

В runAdapterCode2(), пропускается JavaScript Object, как вы бы передать какой-либо параметр в адаптер. Когда worklight пытается выполнить java-метод, он будет искать сигнатуру метода либо для объекта Object, либо для ScriptableObject (а не для NativeObject). Я использовал java-отражение api для проверки передаваемого класса и иерархии. Используя статические методы в ScriptableObject, вы можете запрашивать и изменять значение в объекте. В конце метода вы можете вернуть объект Scriptable. Выполнение этого даст вам объект javascript в поле invocationResults.result. Ниже приведен код java, поддерживающий это. Обратите внимание, что хороший фрагмент кода является частью расследования того, какой тип объекта действительно передается. В нижней части метода находятся несколько строк, необходимых для работы с объектом javascript.

@SuppressWarnings({ "unused", "rawtypes" }) 
public static ScriptableObject add2(ScriptableObject obj) { 
    // code to determine object class being passed in and its heirarchy 
    String result = ""; 
    Class objClass = obj.getClass(); 
    result = "objClass = " + objClass.getName() + "\r\n"; 
    result += "implements="; 
    Class[] interfaces = objClass.getInterfaces(); 
    for (Class classInterface : interfaces) { 
     result += " " + classInterface.getName() ; 
    } 
    result += "\r\nsuperclasses="; 
    Class superClass = objClass.getSuperclass(); 
    while(superClass != null) { 
     result += " " + superClass.getName(); 
     superClass = superClass.getSuperclass(); 
    } 

    // actual code working with the javascript object 
    String a = (String) ScriptableObject.getProperty((ScriptableObject)obj, "z"); 
    ScriptableObject.putProperty((ScriptableObject)obj, "z", new Long(3)); 

    return obj; 
} 

Обратите внимание, что для объекта javascript числовое значение - это Long, а не int. Строки по-прежнему являются строками.

Резюме Есть два способа передать объект javascript, который я нашел до сих пор.

  1. Преобразование в строку в javascript, передать строку в java и восстановить ее в JSONObject.
  2. Передайте объект javascript и используйте классы ScriptableObject для управления на стороне java.
0

Давайте предположим, что у вас есть это в адаптере код

function test(){ 
    var jsonObject = { "param1": 1, "param2" : "hello" }; 

    var param2value = com.mycode.MyClass.parseJsonObject(jsonObject); 

    return { 
     result: param2value 
    }; 
} 

ли на самом деле не имеет значения, где вы получаете JSONObject из, он может прийти как парам от клиента. Worklight использует Rhino JS engine, поэтому функция com.mycode.MyClass.parseJsonObject() получит jsonObject как org.mozilla.javascript.NativeObject. Вы можете легко получить OBJ свойства, как этого

package com.mycode; 

import org.mozilla.javascript.NativeObject; 

public class MyClass { 

    public static String parseJsonObject(NativeObject obj){ 
     String param2 = (String) NativeObject.getProperty(obj, "param2"); 
     return param2; 
    } 
} 
+0

, если вы попытаетесь передать jsonObject в качестве параметра в hardcoding адаптера VS, вы получите ошибки, заявляя, что JSONObject нельзя передать в JSONArray. когда я построил invocationData, я поместил jsonObject в качестве параметров. Если я добавлю '[' и '] вокруг jsonObject, тогда я получаю сообщение об ошибке javaOpject (object) javaOffject от libity. –

+0

Это потому, что массив не является объектом JSON. Объект JSON обернут {}, массив обернут []. Можете ли вы дать образец своего парама? Что именно ты пытаешься сделать? – Anton

+0

Антон, см. Другой ответ, который я дал выше. Я вернулся и смог определить, что он передает ScriptableObject в код адаптера. Я ввел код, который использовал. Если я что-то пропустил, дайте мне знать. –