获取json类型不匹配错误

时间:2014-03-15 13:32:25

标签: android json

我是Android开发的新手,我正在尝试使用json数据。我按照网页“ http://hmkcode.com/android-parsing-json-data/“制作一个简单的应用程序来获取和显示json。它可以在教程json网站上正常工作。但是当我更改url指向我的网站时,我在行上遇到异常错误”JSONObject json =新的JSONObject(结果);“

03-15 08:56:10.518: W/System.err(1330): org.json.JSONException: Value <?xml of type   
java.lang.String cannot be converted to JSONObject
03-15 08:56:10.528: W/System.err(1330):     at org.json.JSON.typeMismatch(JSON.java:111)
03-15 08:56:10.528: W/System.err(1330):     at org.json.JSONObject.<init>(JSONObject.java:159)
03-15 08:56:10.528: W/System.err(1330):     at org.json.JSONObject.<init>(JSONObject.java:172)

当我显示字符串时,我看起来像这样(差不多,我的格式化问题,mgmtresponse行都是一行,我也阻止了ip地址):

 <?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<mgmtResponse 
      responseType="operation"requestUrl="https://128.205.x.xxx/webacs/api/v1/op/info/version"   
      rootUrl="https://128.205.x.xx/webacs/api/v1/op">
  -<versionInfoDTO>
      <result>2.0.0.0.294</result>
   </versionInfoDTO>
 </mgmtResponse>

这是代码的主要部分。正如你所看到的,我尝试了很多东西并注释掉了很多东西来解决这个问题。我陷入了无法接受输入并将其转换为json对象的位置。我想我需要对响应进行格式化,但我无法弄清楚出了什么问题。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Base64;
import android.util.Log;  
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {


EditText etResponse;
TextView tvIsConnected;
static TextView response_code;
static String httpcode;
static String version;
@Override
// oncreate is called when activity is created
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // get reference to the views
    etResponse = (EditText) findViewById(R.id.etResponse);
    tvIsConnected = (TextView) findViewById(R.id.tvIsConnected);
    response_code = (TextView) findViewById(R.id.response_code);
    // check if you are connected or not
    if(isConnected()){
        tvIsConnected.setBackgroundColor(0xFF00CC00);
        tvIsConnected.setText("network is connected");
    }
    else{
        tvIsConnected.setText("network is NOT connected");
    }

    // call AsynTask to perform network operation on separate thread
    new HttpAsyncTask().execute("https://128.205.x.xx/webacs/api/v1/op/info/version");
    // new HttpAsyncTask().execute("https://hmkcode.appspot.com/rest/controller/get.json");
}

public static String GET(String url){
    InputStream inputStream = null;
    String result = "";
    try {

        // create HttpClient
        HttpClient httpclient = new MyHttpClient();

        HttpGet request = new HttpGet(url);
        request.setHeader("Authorization", "Basic " + Base64.encodeToString
                             ("username:password".getBytes(), Base64.NO_WRAP));

        // make GET request to the given URL
        HttpResponse httpResponse = httpclient.execute(request);
        final int StatusCode = httpResponse.getStatusLine().getStatusCode();
        String st=String.valueOf(StatusCode);
        httpcode = st;  

        //HttpResponse httpResponse = HttpClient.execute(new HttpGet(url));
        // receive response as inputStream
        //HttpEntity entity = httpResponse.getEntity();
        //result = EntityUtils.toString(entity);
        inputStream = httpResponse.getEntity().getContent();

        // convert inputstream to string
        if(inputStream != null)    

                result = convertInputStreamToString(inputStream);
        else
            result = "Did not work!";

    } catch (Exception e) {
        Log.d("InputStream", e.getLocalizedMessage());
    }

    return result;

}

private static String convertInputStreamToString(InputStream inputStream) throws IOException{
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader
              (inputStream,"iso-8859-1"),8);
    String line = "";
    String result = "";
    while((line = bufferedReader.readLine()) != null)
        result += line+"\n";
    inputStream.close();
    return result;

}

public boolean isConnected(){
    ConnectivityManager connMgr = (ConnectivityManager) getSystemService  
(Activity.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) 
            return true;
        else
            return false;   
}


private class HttpAsyncTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {

        return GET(urls[0]);
    }
    // onPostExecute displays the results of the AsyncTask.
    // displays results to Edittext and displays recieved to toast
    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
        etResponse.setText(result); 
        response_code.setText(httpcode);

       try {
             //etResponse.setText(result);

             JSONObject json = new JSONObject(result);
             //etResponse.setText(json.toString(1));
             //JSONObject mgmtResponse = 
             //        new JSONObject(json.getString("mgmtResponse"));
             //JSONObject versionInfoDTO = 
             //        new JSONObject(mgmtResponse.getString("versionInfoDTO"));    

    version = "NCS-Version";
            //
    //JSONArray articles = json.getJSONArray("articleList"); //get articles array
    //str += "articles length = "+json.getJSONArray("articleList").length(); 
    //str += "\n--------\n";
    //str += "names: "+articles.getJSONObject(0).names(); //get first articles keys
    //str += "\n--------\n";
    //str += "url: "+articles.getJSONObject(0).getString("url"); //return an article url

    //String str = "NCS Version";
    //version += versionInfoDTO.getJSONObject("result");
    etResponse.setText(version);
        // not - etResponse.setText(json.toString(1));


    } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
        //etResponse.setText(version);

       }
      }
  }

2 个答案:

答案 0 :(得分:0)

正如Rashmi指出的那样,您正在以XML格式接收数据,并尝试将其解析为JSON格式,这会给您一个错误。通常可以在请求URL中指定数据格式。

修改

您使用的是网址https://128.205.x.xx/webacs/api/v1/op/info/version而且我不知道它是什么,如果它是您自己的服务器,但通常,API提供XML和JSON格式,这可能是看起来像这样:

https://example.com:2087/xml-api/functionname

表示XML和

https://example.com:2087/json-api/functionname

表示JSON

答案 1 :(得分:0)

某些网络服务将允许/要求您指定&#34; application / json&#34;作为accept header,除此之外:

HttpGet request = new HttpGet(url);
request.setHeader("Authorization", "Basic " + Base64.encodeToString
                             ("username:password".getBytes(), Base64.NO_WRAP));

说出你想要的东西:

request.setHeader("Accept", "application/json");

如果需要,您提供的是什么:

request.setHeader("Content-type", "application/json");