开发者社区> 问答> 正文

android oss ListObjectOption发送网络请求.获取json数据报错。什么原因?求指点!


11-17 19:08:56.099: E/AndroidRuntime(27941): java.lang.NoSuchMethodError: org.json.JSONObject.stringToValue
11-17 19:08:56.099: E/AndroidRuntime(27941):     at org.json.XML.parse(XML.java:259)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at org.json.XML.parse(XML.java:265)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at org.json.XML.toJSONObject(XML.java:304)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at com.oss_demo.FederationTokenGetter.getTokenFromServer(FederationTokenGetter.java:42)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at com.oss_demo.FederationTokenGetter.getToken(FederationTokenGetter.java:20)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at com.oss_demo.MainActivity$3.getFederationToken(MainActivity.java:85)
11-17 19:08:56.099: E/AndroidRuntime(27941):     at com.alibaba.sdk.android.oss.OSSClient.getFederationToken(OSSClient.java:68)

展开
收起
debug_ 2015-11-17 19:13:14 9587 0
3 条回答
写回答
取消 提交回答
  • 回 2楼qq449774982的帖子
    我第一用的是  JSONObject jsonObject = new JSONObject(String json);  来获取XML数据 会报这个错  org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONObject              
    然后我换了一种方式  导入了 json.jar 架包
    JSONObject jsonObject = null;
    jsonObject = XML.toJSONObject(respoString json);
    用这种方式后就报我第一次 发布的错误了. 不知道 什么 原因。 其实 我的目的是 调用接口罗列Bucket中的Objects 但是 过程中 会发送网络请求。就出现了 这中问题。
    如果您有方法能罗列出Bucket中的Objects 的话。还请指点!感激不尽

    -------------------------

    回 2楼qq449774982的帖子
    我把通过网络请求获取 json 数据的代码粘出来。是从 官方 给的 Demo 里找的 ,我也是这么用的,到我这就报错了!

    private static FederationToken getTokenFromServer(String serverAddress, String userId) {
                String queryUrl = "http://" + serverAddress + "/distribute-token.json?user-name="+ userId;
                String responseStr = null;
                try {
                    DefaultHttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(queryUrl);
                    HttpResponse hr = client.execute(httpGet);
                    responseStr = EntityUtils.toString(hr.getEntity());
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (responseStr == null) {
                    return null;
                }
              //  JSONObject jsonObject = null;        
                try {
                    //jsonObject = XML.toJSONObject(responseStr);
                    
                    JSONObject jsonObject = new JSONObject(responseStr);
                  
                    // JSONObject jsonObject = new JSONObject(responseStr);
                    String ak = jsonObject.getString("accessKeyId");
                    String sk = jsonObject.getString("accessKeySecret");
                    String securityToken = jsonObject.getString("securityToken");
                    long expireTime = jsonObject.getLong("expiration");
                    return new FederationToken(ak, sk, securityToken, expireTime);
                } catch (JSONException e) {
                    Log.e("JSON", e.toString());
                    e.printStackTrace();
                }
                return null;
            }

    -------------------------

    回 1楼oss-dev的帖子
    是的啊 还请你看看我对二楼的回复。不知道您能帮忙解决吗  谢谢

    -------------------------

    回 6楼qq449774982的帖子

    我这边拿到的 responseStr 内容是这样的。
    <Error>
    <Code>InvalidBucketName</Code>
    <Message>The specified bucket is not valid.</Message>
    <RequestId>564BE97F58DB3A0C4E2F70F8</RequestId>
    <HostId>139.196.65.97</HostId>
    <BucketName>distribute-token.json</BucketName>
    </Error>
    这样应该是 我的 业务 server 搭建就已经错了吧。还想 请教下 我要罗列Bucket中的Objects 的话 需要搭建 业务 server吗。看了几遍官方的Demo 对这个罗列Bucket中的Objects 还是不明白。不知道他需要做什么准备工作? 实现的思路步骤 能否指点我一下。 谢谢!

    -------------------------

    回 8楼qq449774982的帖子
    谢谢 我试一试!

    -------------------------

    回 8楼qq449774982的帖子
    您好,我换了ak/sk本地签权方式.其他的都没有改.一次就成功了.但是 这种方式 会把 accessKey 和 screctKey 暴漏在代码里。这种方式 不好.暂时先用这种方式了。非常谢谢你。等之后改善了在交流 。谢谢
    2015-11-18 09:11:39
    赞同 展开评论 打赏
  • Reandroid oss ListObjectOption发送网络请求.获取json数据报错。什么原因?求指
    看上去是您实现的FederationTokenGetter中重载方法的时候,解析json时调用了一个android上没有的方法,或者您没有引入相关的库。可以尝试使用android原生的json解析方式来试下。

    -------------------------

    Reandroid oss ListObjectOption发送网络请求.获取json数据报错。什么原因?求指
    String queryUrl = "http://" + serverAddress + "/distribute-token.json?user-name="+ userId;

    getTokenFromServer() 这种用法,需要您这边配置有自己的业务server,server上通过STS SDK拿到sts token,把token交到移动端。就是这段代码:

                String queryUrl = "http://" + serverAddress + "/distribute-token.json?user-name="+ userId;
                String responseStr = null;
                try {
                    DefaultHttpClient client = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(queryUrl);
                    HttpResponse hr = client.execute(httpGet);
                    responseStr = EntityUtils.toString(hr.getEntity());
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

    您这边搭建有这样的业务server了吗?是否能够把responseStr打印出来验证token已经拿到?按照官方demo,这个responseStr应该是一个json串,直接用android的json库解析就好了,不需要引入其他json库,也不需要做XML.toJson的操作。

    -------------------------

    回 7楼debug的帖子
    可以从简单的做起,参考一下这个demo:

    https://github.com/alibaba/alicloud-android-demo

    先不走sts token授权的方式,先在本地做测试,了解怎么listObjects。

    这个文件演示了具体的方法:https://github.com/alibaba/alicloud-android-demo/blob/master/oss_android_demo/src/main/java/com/alibaba/sdk/android/dpa/oss_android_demo/ListObjectsInBucketDemo.java

    主要步骤就是:初始化ossService(包括鉴权,先使用本地鉴权的方式),然后获取bucket,再罗列bucket。
    2015-11-17 20:16:30
    赞同 展开评论 打赏
  • Re:android oss ListObjectOption发送网络请求.获取json数据报错。什么原因?求指 ..
    看上去是Json的jar包冲突了
    2015-11-17 19:23:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载