Извлечение JSON из URL на Android - PullRequest
6 голосов
/ 07 апреля 2011

Приложение моего телефона прекрасно загружает контент в текстовом режиме. Ниже приведен код для этого. Я вызываю коммуникатор класса и exectueHttpGet:

URL_Data = new Communicator().executeHttpGet("Some URL");

public class Communicator {
public String executeHttpGet(String URL) throws Exception 
{
    BufferedReader in = null;
    try 
    {
        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "android");
        HttpGet request = new HttpGet();
        request.setHeader("Content-Type", "text/plain; charset=utf-8");
        request.setURI(new URI(URL));
        HttpResponse response = client.execute(request);
        in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

        StringBuffer sb = new StringBuffer("");
        String line = "";

        String NL = System.getProperty("line.separator");
        while ((line = in.readLine()) != null) 
        {
            sb.append(line + NL);
        }
        in.close();
        String page = sb.toString();
        //System.out.println(page);
        return page;
    } 
    finally 
    {
        if (in != null) 
        {
            try 
            {
                in.close();
            } 
            catch (IOException e)    
            {
                Log.d("BBB", e.toString());
            }
        }
    }
}
}

Что я получаю, это (исходный код URL):

[{"id_country":"3","country":"AAA"},{"id_country":"8","country":"BBB"},
{"id_country":"66","country":"CCC"},{"id_country":"14","country":"DDD"},
{"id_country":"16","country":"EEE"},{"id_country":"19","country":"FFF"},
{"id_country":"24","country":"GGG"},{"id_country":"33","country":"HHH"},
{"id_country":"39","country":"III"},{"id_country":"44","country":"JJJ"},
{"id_country":"45","country":"KKK"},{"id_country":"51","country":"LLL"},
{"id_country":"54","country":"MMM"},{"id_country":"55","country":"NNN"},
{"id_country":"57","country":"OOO"},{"id_country":"58","country":"PPP"},
{"id_country":"63","country":"RRR"},{"id_country":"65","country":"SSS"}]

Этот ответ является строкой. На сервере он выводится (с PHP) как объект JSON, и теперь в моем Android PHP я хочу преобразовать эту строку в JSON. Это возможно?

Ответы [ 6 ]

14 голосов
/ 07 апреля 2011

То, что вы получаете, представляет собой последовательность символов из InputStream, которую вы добавляете к StringBuffer и конвертируете в String в конце - так что результат String в порядке:)

То, что вы хотите - это обработать эту строку с помощью org.json.* классов, таких как

String page = new Communicator().executeHttpGet("Some URL");
JSONObject jsonObject = new JSONObject(page);

, а затем работать на jsonObject. Поскольку данные, которые вы получаете, являются массивом, вы можете сказать:

String page = new Communicator().executeHttpGet("Some URL");
JSONArray jsonArray = new JSONArray(page);
for (int i = 0 ; i < jsonArray.length(); i++ ) {
  JSONObject entry = jsonArray.get(i);
  // now get the data from each entry
}
2 голосов
/ 07 апреля 2011

EDIT:

Чтобы продолжить вопрос, с которым я связал вас ранее, используйте этот пример. поместите его в функцию, которая возвращает JSONArray (чтобы затем вы могли перебрать массив и использовать array.getString). Это работает для большинства объемов данных. Он отправит правильные заголовки сжатия на веб-сервер и также обнаружит сжатый gzip результат. Попробуйте:

    URL url = new URL('insert your uri here');
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
    urlConn.setRequestProperty("Accept-Encoding", "gzip");
    HttpURLConnection httpConn = (HttpURLConnection) urlConn;
    httpConn.setAllowUserInteraction(false);
    httpConn.connect();
    if (httpConn.getContentEncoding() != null) {
        String contentEncoding = httpConn.getContentEncoding().toString();
        if (contentEncoding.contains("gzip")) {
        in = new GZIPInputStream(httpConn.getInputStream());
        }
        // else it is encoded and we do not want to use it...
    } else {
        in = httpConn.getInputStream();
    }
    BufferedInputStream bis = new BufferedInputStream(in);
    ByteArrayBuffer baf = new ByteArrayBuffer(1000);
    int read = 0;
    int bufSize = 1024;
    byte[] buffer = new byte[bufSize];
    while (true) {
        read = bis.read(buffer);
        if (read == -1) {
        break;
        }
        baf.append(buffer, 0, read);
    }
    queryResult = new String(baf.toByteArray());
    return new JSONArray(queryResult);

/ Конец редактирования

Попробуйте прочитать решение, которое я разместил в этом вопросе:

Создать список в приложении для Android

Hth

Stu

1 голос
/ 07 апреля 2011

используйте org.json.JSONObject, как в

JSONObject json = new JSONObject(oage);

, на что следует обратить внимание, когда ответ просто "true" или "false".возможно, вы захотите создать утилиту, которая будет проверять эти случаи, в противном случае просто загрузите JSONObject.

хорошо, в этом случае вы бы использовали JSONArray

JSONArray jsonArray = new JSONArray(page); 
for (int i = 0; i < jsonArray.length(); ++i) {
  JSONObject element = jsonArray.getJSONObject(i);
  ..... 
}
0 голосов
/ 21 октября 2016

Предположим, что у нас есть класс POJO с именем Post

public List<Post> getData(String URL) throws InterruptedException, ExecutionException {
    //This has to be AsyncTask because data streaming from remote web server should be running in background thread instead of main thread. Or otherwise your application will hung while connecting and getting data.
    AsyncTask<String,String, List<Post>> getTask = new AsyncTask<String,String,List<Post>>(){
        @Override
        protected List<Post> doInBackground(String... params) {
            List<Post> postList  = new ArrayList<Post>();
            String response = "";
            try{
                //Read stream data from url START
                java.net.URL url = new java.net.URL(params[0]);
                HttpURLConnection urlConnection = (HttpURLConnection)
                        url.openConnection();
                BufferedReader reader = new  BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                String line = "";
                while((line = reader.readLine()) != null){
                    response += line + "\n";
                }
                //Read stream data from url END

                //Parsing json data from reponse data START
                JSONArray jsonArray = new JSONArray(response);
                for(int i=0;i<jsonArray.length();i++){

                    String message = jsonArray.getJSONObject(i).getString("message");
                    // Post class has a constructor which accept message value.
                    postList.add(new Post(message));
                }
                //Parsing json data from reponse data END
            } catch (Exception e){
                e.printStackTrace();
            }

            return postList;
        }

        protected void onPostExecute(String result) {
        }
    };
    //This will return a list of posts
    return getTask.execute(URL).get();
}
0 голосов
/ 07 апреля 2011

просто попробуй как

/// ...

JSONArray jsonArray = new JSONArray (responseString);

для (JSONObject jsonObject: jsonArray) { .........
}

//// ..

0 голосов
/ 07 апреля 2011

Вы пытались установить тип контента на application/json?

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