Ошибка синтаксического анализа JSONArray, возвращенного из веб-службы .NET - PullRequest
1 голос
/ 16 ноября 2011

У меня реализован веб-сервис, который возвращает строку JSON следующим образом:

 {"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;
       }

Это код веб-службы, возвращающий 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;

    }

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Ваш результат изначально не JSONArray, а JSONObject.

Попробуйте:

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

JSONArray jArray = jsonResponse.getJSONArray("checkrecord");
1 голос
/ 17 ноября 2011

Попробуйте вот так

  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"));
        }
     }
1 голос
/ 16 ноября 2011

Ваш веб-сервис не возвращает чистый JSON, он возвращает JSON в виде строкового значения, возвращаемого веб-службой XML SOAP. Фактически, это может быть сообщение об ошибке в XML, поскольку вы не отправляете действительный запрос SOAP от клиента.

Ваш URL должен возвращать сырой JSON, без конверта SOAP XML. Поищите в Google информацию о том, как писать веб-службы на основе JSON в ASP.NET, WCF или другой технологии MS, которая может быть вам знакома.

Редактировать

Если вы хотите увидеть необработанный результат вашего URL, попробуйте использовать инструмент вроде Fiddler для отслеживания ответа HTTP.

Кроме того, если вы хотите совершать вызовы веб-службы SOAP из Android, проверьте ksoap2 для Android

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...