Parse.com从云clode函数接收JSON数组

时间:2015-09-29 15:11:12

标签: android json arraylist parse-platform cloud-code

我试图从我的Android应用程序运行自定义云代码功能。我觉得这很奇怪,我认为平台指南中没有充分记录。

请帮助我,我在这方面花了太多时间!

自定义云代码函数返回一个如下所示的对象数组:

[  
   {  
      "status":false,
      "usr":{  
         "URL":"a string",
         "__type":"Object",
         "blacklisted":false,
         "className":"_User",
         "createdAt":"2015-09-28T08:22:09.266Z",
         "description":"a string",
         "email":"a string",
         "emailVerified":true,
         "facebookId":"a string",
         "first_name":"a string",
         "gender":"male",
         "last_name":"a string",
         "name":"Filippo",
         "objectId":"a string",
         "updatedAt":"2015-09-28T12:58:31.455Z",
         "username":"a string"
      }
   }
   // Some other objects...
]

现在我试图用Android客户端调用云代码函数:

final HashMap<String, ParseObject> params = new HashMap<String, ParseObject>();
    ParseCloud.callFunctionInBackground("getConversations", params, new FunctionCallback<ArrayList<JSONObject>>() {
        @Override
        public void done(final ArrayList<JSONObject> results, ParseException e) {
            myAdapter = new InboxAdapter(getActivity(), results);
            listview.setAdapter(myAdapter);
        } 
}

但是我得到了一些奇怪的行为,因为使用ArrayList<JSONObject>作为回调的通用符号不会允许我填充适配器,这会在java.lang.ClassCastException: java.util.HashMap cannot be cast to org.json.JSONObject方法中不断返回getItem()

private ArrayList<JSONObject> list;
private Context ctx;

public InboxAdapter(Context c, ArrayList<JSONObject> s) {
    ctx = c;
    list = s;
}
/* All other methods */
@Override
public JSONObject getItem(int position) {
    return list.get(position); // Gives exception!
}

我觉得这很奇怪,因为它是JSONObject的一个ArrayList,不应该关心地图等等。 还试图使用new FunctionCallback<JSONArray>() {}反弹,因为它需要一个arraylist! (说实话,我没有弄明白为什么)。

那么我该怎么办才能处理来自Android端的响应?为了正确解析结果,我有什么必须做的吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

你可以修改你在云中编写的getConversations()..在response.success中传递一个Json对象......这是一个工作示例,其中test是你的getConversations()函数: -

 Parse.Cloud.define("test", function(request, response) {

    var text = "hello world";

  var jsonObject = {
    "answer": text
  };

  response.success(jsonObject);
});

然后调用它并从android获取值,如下所示: -

ParseCloud.callFunctionInBackground("test", null, new FunctionCallback< Map<String, Object> >() {
        public void done(Map<String, Object> mapObject, ParseException e) {
          if (e == null){   
            Toast.makeText(appContext, mapObject.get("answer").toString(), Toast.LENGTH_LONG).show();
          } 
        }
    });