Как мне разобрать JSON в Android?

Как разобрать канал JSON в Android?

3 ответа

Примечание: этот ответ не обновлялся с 2013 года. Предлагаемый способ загрузки json больше не рекомендуется для Android, так как http-клиент был удален из SDK начиная с API 23.
Тем не менее, логика разбора ниже по-прежнему применяется


В Android есть все инструменты, необходимые для анализа встроенного json. Пример следует, нет необходимости в GSON или что-то в этом роде.

Получите ваш JSON:

DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(http://someJSONUrl/jsonWebService);
// Depends on your web service
httppost.setHeader("Content-type", "application/json");

InputStream inputStream = null;
String result = null;
try {
    HttpResponse response = httpclient.execute(httppost);           
    HttpEntity entity = response.getEntity();

    inputStream = entity.getContent();
    // json is UTF-8 by default
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
    StringBuilder sb = new StringBuilder();

    String line = null;
    while ((line = reader.readLine()) != null)
    {
        sb.append(line + "\n");
    }
    result = sb.toString();
} catch (Exception e) { 
    // Oops
}
finally {
    try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}

теперь у вас есть JSON, и что?

Создайте JSONObject:

JSONObject jObject = new JSONObject(result);

Чтобы получить конкретную строку

String aJsonString = jObject.getString("STRINGNAME");

Чтобы получить конкретный логический

boolean aJsonBoolean = jObject.getBoolean("BOOLEANNAME");

Чтобы получить конкретное целое число

int aJsonInteger = jObject.getInt("INTEGERNAME");

Чтобы получить конкретную длинную

long aJsonLong = jObject.getLong("LONGNAME");

Чтобы получить конкретный дубль

double aJsonDouble = jObject.getDouble("DOUBLENAME");

Чтобы получить конкретный JSONArray:

JSONArray jArray = jObject.getJSONArray("ARRAYNAME");

Чтобы получить элементы из массива

for (int i=0; i < jArray.length(); i++)
{
    try {
        JSONObject oneObject = jArray.getJSONObject(i);
        // Pulling items from the array
        String oneObjectsItem = oneObject.getString("STRINGNAMEinTHEarray");
        String oneObjectsItem2 = oneObject.getString("anotherSTRINGNAMEINtheARRAY");
    } catch (JSONException e) {
        // Oops
    }
}
  1. Написание класса JSON Parser

    public class JSONParser {
    
        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";
    
        // constructor
        public JSONParser() {}
    
        public JSONObject getJSONFromUrl(String url) {
    
            // Making HTTP request
            try {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
    
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
    
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            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();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }
    
            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }
    
            // return JSON String
            return jObj;
    
        }
    }
    
  2. Парсинг данных JSON После того, как вы создали класс синтаксического анализатора, нужно знать, как использовать этот класс. Ниже я объясняю, как анализировать JSON (взятый в этом примере), используя класс анализатора.

2.1. Храните все эти имена узлов в переменных: в контактах json есть такие элементы, как имя, адрес электронной почты, адрес, пол и номера телефонов. Итак, во-первых, хранить все эти имена узлов в переменных. Откройте ваш основной класс активности и объявите, что храните все имена узлов в статических переменных.

// url to make request
private static String url = "http://api.9android.net/contacts";

// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";

// contacts JSONArray
JSONArray contacts = null;

2.2. Используйте класс анализатора, чтобы получить JSONObject и проходить по каждому элементу json. Ниже я создаю экземпляр класса JSONParser и использую цикл for. Я перебираю каждый элемент json и, наконец, сохраняю все данные json в переменной.

// Creating JSON Parser instance
JSONParser jParser = new JSONParser();

// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);

try {
    // Getting Array of Contacts
    contacts = json.getJSONArray(TAG_CONTACTS);

    // looping through All Contacts
    for(int i = 0; i < contacts.length(); i++){
        JSONObject c = contacts.getJSONObject(i);

        // Storing each json item in variable
        String id = c.getString(TAG_ID);
        String name = c.getString(TAG_NAME);
        String email = c.getString(TAG_EMAIL);
        String address = c.getString(TAG_ADDRESS);
        String gender = c.getString(TAG_GENDER);

        // Phone number is agin JSON Object
        JSONObject phone = c.getJSONObject(TAG_PHONE);
        String mobile = phone.getString(TAG_PHONE_MOBILE);
        String home = phone.getString(TAG_PHONE_HOME);
        String office = phone.getString(TAG_PHONE_OFFICE);

    }
} catch (JSONException e) {
    e.printStackTrace();
}

Я написал для вас простой пример и прокомментировал источник. В примере показано, как получить живой json и выполнить синтаксический анализ в JSONObject для детального извлечения:

try{
    // Create a new HTTP Client
    DefaultHttpClient defaultClient = new DefaultHttpClient();
    // Setup the get request
    HttpGet httpGetRequest = new HttpGet("http://example.json");

    // Execute the request in the client
    HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
    // Grab the response
    BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
    String json = reader.readLine();

    // Instantiate a JSON object from the request response
    JSONObject jsonObject = new JSONObject(json);

} catch(Exception e){
    // In your production code handle any errors and catch the individual exceptions
    e.printStackTrace();
}

Получив JSONObject, обратитесь к SDK за подробной информацией о том, как извлечь нужные данные.

Другие вопросы по тегам