2014-01-17 22 views
2

我想将完整的JSON对象传递给worklight中的java适配器。此适配器将调用多个其他远程资源来满足请求。我想传递json结构,而不是列出所有参数,原因很多。调用worklight过程效果很好。我通过以下作为参数:将JSON对象传递给worklight Java适配器

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

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

+0

只要将它作为字符串传递并使用任何可用于Java的JSON库中的任何一种,都可以:https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java – Zarathuztra

回答

0

为了更好地解释我在这里做什么,我希望能够为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上使用静态方法,您可以查询和修改对象中的值。在该方法结束时,您可以让它返回一个脚本对象。这样做会在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端进行操作。
0

让我们假设你有这样的适配器代码

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

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

    return { 
     result: param2value 
    }; 
} 

并没有真正身在何处,您取得的JSONObject,它可能会从客户端设置了一个param。 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; 
    } 
} 
+0

如果您尝试将jsonObject作为参数传递到适配器VS硬编码,则会出现错误,指出无法将JSONObject转换为JSONArray。当我构建invocationData时,我把jsonObject作为参数。如果我在jsonObject的周围添加'['和']',那么我得到一个无法从liberty中找到parsonJsonObject(object)java错误消息。 –

+0

这是因为数组不是JSON对象。 JSON对象用{}包裹,数组用[]包装。你可以给你的参数的样本?你究竟想要做什么? – Anton

+0

安东,请参阅我对上述的其他回复。我回去了,并能够确定它将ScriptableObject传递给适配器代码。我已经输入了我正在使用的代码。如果我错过了什么,请告诉我。 –