【问题标题】:Passing a JSON object to worklight java adapter将 JSON 对象传递给 worklight java 适配器
【发布时间】:2014-01-17 17:49:49
【问题描述】:

我想将一个完整的 JSON 对象传递给 worklight 中的 java 适配器。该适配器将调用多个其他远程资源来完成请求。由于多种原因,我想传递 json 结构而不是列出所有参数。调用工作灯程序效果很好。我将以下内容作为参数传递:

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

该工具适用于哪个。当它调用我的 java 代码时,我看到一个对象类型 JSObjectConverter$1 正在传递。在 java 调试中,我可以看到对象中的值,但我没有看到任何有关如何执行此操作的文档。如果没记错的话,$1 表示它是一个正在传递的匿名内部类。有没有更好的方法在适配器中传递 json 对象/结构?

【问题讨论】:

标签: ibm-mobilefirst worklight-adapters


【解决方案1】:

假设你在适配器代码中有这个

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

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

    return {
        result: param2value
    };
}

从哪里获取 jsonObject 并不重要,它可能来自客户端的参数。 Worklight 使用 Rhino JS 引擎,因此 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;
    }
}

【讨论】:

  • 如果您尝试将 jsonObject 作为参数传递到适配器 VS 硬编码中,则会收到错误消息,指出无法将 JSONObject 强制转换为 JSONArray。当我构建 invocationData 时,我将 jsonObject 作为参数。如果我在 jsonObject 周围添加 '[' 和 ']',那么我会从 liberty 收到 can't find parsonJsonObject(object) java 错误消息。
  • 这是因为数组不是 JSON 对象。 JSON 对象用 {} 包裹,数组用 [] 包裹。你能给你的参数样本吗?你到底想做什么?
  • 安东,请参阅我在上面给出的其他回复。我回去并能够确定它将 ScriptableObject 传递给适配器代码。我已经输入了我正在使用的代码。如果我遗漏了什么,请告诉我。
【解决方案2】:

为了更好地解释我在这里做什么,我希望能够将 javascript 对象传递给适配器并让它返回一个更新的 javascript 对象。好像有两种方法。首先是我几天前通过序列化和反序列化javascript对象回答的问题。另一种是使用 ScriptableObject 类。我最终想要的是使用所描述的适配器框架来传递 javascript 对象。这样做时,Adapter JS-impl 代码如下所示:

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

客户端应用程序中调用上述适配器的 javascript 代码。请注意,我有一个函数可以测试将 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 对象被传递,就像您将任何参数传递给适配器一样。当 worklight 尝试执行 java 方法时,它将寻找一个方法签名,即采用 Object 或 ScriptableObject(不是 NativeObject)。我使用 java 反射 api 来验证传入的类和层次结构。使用 ScriptableObject 上的静态方法,您可以查询和修改对象中的值。在方法结束时,您可以让它返回一个 Scriptable 对象。这样做会在 invocationResults.result 字段中返回一个 javascript 对象。下面是支持这个的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 端进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多