无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float

Posted

技术标签:

【中文标题】无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float【英文标题】:Json Object cannot be cast to Float using parse.com cloud function Android 【发布时间】:2014-10-28 12:37:49 【问题描述】:

我正在按照https://parse.com/docs/cloud_code_guide?language=android#functions-calling 的教程在 android 上获取云数据。 Java Script 代码如下:

Parse.Cloud.define("averageStars", function(request, response) 
  var query = new Parse.Query("Review");
  query.equalTo("movie", request.params.movie);
  query.find(
    success: function(results) 
      var sum = 0;
      for (var i = 0; i < results.length; ++i) 
        sum += results[i].get("stars");
      
      response.success(sum / results.length);
    ,
    error: function() 
      response.error("movie lookup failed");
    
  );
);

android端代码如下:

 @Override
        public void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            // Get the view from listview_main.xml
            setContentView(R.layout.listview_main);
            HashMap<String, Object> params = new HashMap<String, Object>();
            params.put("movie", "The Matrix");
            ParseCloud.callFunctionInBackground("averageStars", params, new FunctionCallback<Float>() 
              public void done(Float ratings, ParseException e) 
                   if (e == null) 
                      // ratings is 4.5
                   
               
            );
            // Execute RemoteDataTask AsyncTask
            new RemoteDataTask().execute();
        

我还成功地将代码从解析控制台部署到云端。但我收到错误:java.lang.ClassCastException: org.json.JSONObject$1 cannot be cast to java.lang.Float

请承认我做错了什么。我完全按照教程。 提前致谢。

【问题讨论】:

你从哪里得到这个异常。无论如何Java中的每个对象都有toString()方法,尝试使用它 @MikeMinaev 感谢您的回复。我错误地编辑了我的帖子,我写了 java.lang.String。确切的错误是 java.lang.ClassCastException: org.json.JSONObject$1 cannot be cast to java.lang.Float 在调试时它在这一行给出错误'ParseCloud.callFunctionInBackground("averageStars", params, new FunctionCallback () ' @muhammadusmankhan 我认为问题出在他们的 SDK 中。如果您的 CloudCode 返回 4.5,那么您的 android 函数就像 'ParseCloud.callFunctionInBackground("averageStars", params, new FunctionCallback() ' 那么一切正常。但是如果您的 CloudCode 返回 4,那么它会崩溃。我的解决方法是从 CloudCode 返回字符串,并在 android 代码中将字符串转换为浮点数。 FWIW,当我试图返回 ParseObject 但返回 NULL 值时,我遇到了一个非常相似的错误。我最终这样做是为了看看我是否有一个有效的结果:if (returnedObject.getClass() != ParseObject.class) 。不确定同样的事情是否适用于基元。 【参考方案1】:

你没有覆盖FunctionCallback&lt;Float&gt;();的done方法

请像这样替换解析云函数:

ParseCloud.callFunctionInBackground("averageStars", params, new FunctionCallback<Float>() 
    @Override
    public void done(Float ratings, ParseException e) 
        if (e == null) 
            // ratings is 4.
        
    
);

【讨论】:

【参考方案2】:

我认为原因是没有评论数据。 results.length 为 0 所以 response.success(sum / results.length); 将是一个 空 JSON 对象。 我的解决方案是:检查除零异常并始终返回 Stringvar avg = 0; if (results.length != 0) avg = sum / results.length response.success(avg.toString());

【讨论】:

以上是关于无法使用 parse.com 云功能 Android 将 Json 对象强制转换为 Float的主要内容,如果未能解决你的问题,请参考以下文章

Parse.com SendGrid 云模块:无法发送标头参数对象

parse.com 云代码无法通过 mandrillapp 发送电子邮件

Parse.com 云代码 - 无法弄清楚为啥 javascript 变量在所有数组项中具有相同的值

如何将云代码从 parse.com 移动到 heroku

使用云代码操作 parse.com 类

Parse.com 云代码失败