2011-11-16 111 views
1

我實現了一個Web服務,它返回一個JSON字符串返回如下:錯誤解析JSONArray從.NET Web服務

{"checkrecord":[{"rollno":"abc2","percentage":40,"attended":12,"missed":34}],"Table1":[]} 

在我的Android應用我試圖解析字符串轉換爲JSONArray,但我無法這樣做,因爲我在logcat中遇到以下異常:

11-16 22:15:57.381: ERROR/log_tag(462): Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray 

如何解決這個問題?

我的Android代碼如下:

public static JSONArray getJSONfromURL(String b) 
    { 

    //initialize 
    InputStream is = null; 
    String result = ""; 
    JSONArray jArray = null; 

    //http post 
    try{ 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 

    }catch(Exception e){ 
     Log.e("log_tag", "Error in http connection "+e.toString()); 
    } 

    //convert response to string 
    try{ 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     result=sb.toString(); 
    }catch(Exception e) 
      { 
     Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    //try parse the string to a JSON array 
    try{ 
      jArray = new JSONArray(result); 
    } 
      catch(JSONException e) 
      { 
     Log.e("log_tag", "Error parsing data "+e.toString()); 
    } 

    return jArray; 
     } 

這是Web服務代碼,返回JSON

 public class Service1 : System.Web.Services.WebService 
{ 
    [WebMethod] 

    public String getdata(String rollno) 
    { 
     String json; 
     try 
     { 

      using (SqlConnection myConnection = new SqlConnection(@"Data Source=\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123")) 
      { 

       string select = "select * from checkrecord where rollno=\'" + rollno + "\'"; 
       SqlDataAdapter da = new SqlDataAdapter(select, myConnection); 
       DataSet ds = new DataSet(); 
       da.Fill(ds, "checkrecord"); 
       DataTable dt = new DataTable(); 
       ds.Tables.Add(dt); 
       json = Newtonsoft.Json.JsonConvert.SerializeObject(ds); 

      } 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return null; 

     } 

     return json; 

    } 
+1

您返回的字符串中包含的事實 '<?xml的' 告訴我您的Web服務正在返回XML而不是您指定的JSON。確保您提供的網址實際上返回了JSON。 –

+0

它只返回json,我發佈了我的web服務代碼 –

回答

1

Web服務不返回純JSON,它返回JSON作爲從XML SOAP的Web服務的字符串返回值。實際上,它可能是XML中的錯誤消息,因爲您沒有從客戶端發送有效的SOAP請求。

您的URL需要返回原始JSON,並且沒有SOAP XML Envelope。在谷歌搜索如何編寫ASP.NET,WCF或其他可能熟悉的MS技術的基於JSON的Web服務。

編輯

如果你想看到你的URL的原始結果,請嘗試使用像Fiddler一個工具來監控HTTP響應。

另外,如果你想從Android的SOAP Web服務調用,檢查出ksoap2 for Android

+0

好的,有沒有什麼辦法可以在我的Android應用中使用JSON字符串。我打算使用JSON創建一個TableLayout。那我應該怎麼辦? –

+0

有兩種選擇 - 1)將您的Web服務更改爲僅在結果中返回JSON的「REST-like」Web服務(https://www.google.com/search?sourceid=chrome&ie=UTF-8&q=rest + json + service + asp.net)或者2)改變你的客戶端來做一個實際的SOAP請求,就像你當前的Web服務所期望的一樣(參見我的編輯鏈接ksoap2 - 一個用於Android和移動平臺的SOAP Web服務庫) –

+0

我試過使用SOAP但又是如何獲得使用kso​​ap的JSON格式的響應? –

2

您最初的結果是不是一個JSONArray而是JSONObject

試試這個:

JSONObject jsonResult = new JSONObject(new String(reader)); 

JSONArray jArray = jsonResponse.getJSONArray("checkrecord"); 
+0

什麼是「閱讀器」?以及我應該怎樣初始化jsonResponse? –

+0

雖然您可能對JSON的格式正確,但錯誤表示解析器遇到XML預處理指令,該指令不屬於有效的JSON字符串。 –

+0

閱讀器是你的BufferedReader。 –

1

嘗試這樣

JSONObject jsonobject = new JSONObject(result); 
    JSONArray array = jsonobject.getJSONArray("checkrecord"); 
     if(array.length()>0){ 
      int max = array.length(); 
     for (int i = 0; i < max; i++) { 
      JSONObject tmp = array.getJSONObject(i); 
      list.add(tmp.getString("rollno")); 
      mandatoryFlagList.add(tmp.getString("percentage")); 
     } 
    }