2011-11-16 112 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")); 
     } 
    }