Статьи

Разбор JSON для Android с помощью Gson

Помимо XML, JSON — очень распространенный формат, используемый в ответах API. Его простота помогла получить широкое распространение в пользу более многословного XML. Кроме того, JSON можно легко комбинировать с REST, создавая понятные и простые в использовании API. Android включает поддержку JSON в свой SDK, как кто-то может найти в сводке JSON-пакета . Однако, используя эти классы, разработчик должен иметь дело с низкоуровневым анализом JSON, который, на мой взгляд, утомителен и скучен. По этой причине в этом руководстве я собираюсь показать вам, как выполнять автоматический анализ JSON. Для этой цели мы будем использовать библиотеку Google Gson . С официального сайта:

Gson — это библиотека Java, которую можно использовать для преобразования объектов Java в их представление JSON. Его также можно использовать для преобразования строки JSON в эквивалентный объект Java. Gson может работать с произвольными объектами Java, включая уже существующие объекты, исходный код которых у вас отсутствует.
Есть несколько проектов с открытым исходным кодом, которые могут конвертировать объекты Java в JSON. Однако большинство из них требуют, чтобы вы размещали аннотации Java в своих классах, чего вы не можете сделать, если у вас нет доступа к исходному коду. Большинство также не полностью поддерживает использование Java Generics. Гсон считает, что оба они очень важные цели дизайна.

Отлично, именно то, что нам нужно. Прежде чем углубляться в код, вы можете взглянуть на Руководство пользователя Gson и добавить в закладки Javadocs API Gson . Давайте начнем с загрузки Gson , с текущей версией 1.6. Нам нужен gson-1.6.jar из дистрибутива.

Давайте приступим к созданию проекта Eclipse с именем «AndroidJsonProject» следующим образом:

Добавьте Gson JAR в ваш проект

Добавьте Gson JAR в classpath вашего проекта.

Чтобы проиллюстрировать, как использовать Gson для анализа JSON, мы собираемся проанализировать ответ JSON из API Twitter. Проверьте документацию по API Twitter для получения дополнительной информации. Мы собираемся использовать метод API поиска для выполнения специальных поисков.

Например, для поиска в Twitter о JavaCodeGeeks и получения результатов в формате JSON, вот соответствующий URL:

http://search.twitter.com/search.json?q=javacodegeeks

Это даст однострочный ответ JSON, содержащий всю необходимую информацию. Этот вкладыш довольно сложен для чтения, поэтому редактор JSON был бы весьма полезен. Я использую плагин Eclipse Json Editor и работает очень хорошо. Вот как выглядит ответ, отформатированный в моей Eclipse IDE:

Как видите, у нас есть ряд результатов, и после этого у нас есть некоторые другие поля, такие как «max_id», «since_id», «query» и т. Д.

Таким образом, наш основной объект модели с именем «SearchResponse» будет выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.javacodegeeks.android.json.model;
 
import java.util.List;
 
import com.google.gson.annotations.SerializedName;
 
public class SearchResponse {
     
    public List<Result> results;
     
    @SerializedName("max_id")
    public long maxId;
     
    @SerializedName("since_id")
    public int sinceId;
     
    @SerializedName("refresh_url")
    public String refreshUrl;
     
    @SerializedName("next_page")
    public String nextPage;
     
    @SerializedName("results_per_page")
    public int resultsPerPage;
     
    public int page;
     
    @SerializedName("completed_in")
    public double completedIn;
     
    @SerializedName("since_id_str")
    public String sinceIdStr;
     
    @SerializedName("max_id_str")
    public String maxIdStr;
     
    public String query;
     
}

Мы предоставляем различные открытые поля (также могут использоваться методы получения / установки с закрытыми полями), и в тех случаях, когда имя поля не соответствует ответу JSON, мы аннотируем аннотацию SerializedName .

Обратите внимание, что у нас также есть список результатов с соответствующим классом модели:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.javacodegeeks.android.json.model;
 
import com.google.gson.annotations.SerializedName;
 
public class Result {
     
    @SerializedName("from_user_id_str")
    public String fromUserIdStr;
     
    @SerializedName("profile_image_url")
    public String profileImageUrl;
     
    @SerializedName("created_at")
    public String createdAt;
     
    @SerializedName("from_user")
    public String fromUser;
     
    @SerializedName("id_str")
    public String idStr;
     
    public Metadata metadata;
     
    @SerializedName("to_user_id")
    public String toUserId;
     
    public String text;
     
    public long id;
     
    @SerializedName("from_user_id")
    public String from_user_id;
 
    @SerializedName("iso_language_code")
    public String isoLanguageCode;
 
    @SerializedName("to_user_id_str")
    public String toUserIdStr;
 
    public String source;
     
}

Наконец, у нас есть еще один класс с именем «Метаданные»:

01
02
03
04
05
06
07
08
09
10
package com.javacodegeeks.android.json.model;
 
import com.google.gson.annotations.SerializedName;
 
public class Metadata {
     
    @SerializedName("result_type")
    public String resultType;
 
}

Давайте теперь посмотрим, как все это подключить с помощью Gson. Вот наша деятельность:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package com.javacodegeeks.android.json;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
 
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
 
import com.google.gson.Gson;
import com.javacodegeeks.android.json.model.Result;
import com.javacodegeeks.android.json.model.SearchResponse;
 
public class JsonParsingActivity extends Activity {
     
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
         
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        InputStream source = retrieveStream(url);
         
        Gson gson = new Gson();
         
        Reader reader = new InputStreamReader(source);
         
        SearchResponse response = gson.fromJson(reader, SearchResponse.class);
         
        Toast.makeText(this, response.query, Toast.LENGTH_SHORT).show();
         
        List<Result> results = response.results;
         
        for (Result result : results) {
            Toast.makeText(this, result.fromUser, Toast.LENGTH_SHORT).show();
        }
         
    }
     
    private InputStream retrieveStream(String url) {
         
        DefaultHttpClient client = new DefaultHttpClient();
         
        HttpGet getRequest = new HttpGet(url);
           
        try {
            
           HttpResponse getResponse = client.execute(getRequest);
           final int statusCode = getResponse.getStatusLine().getStatusCode();
            
           if (statusCode != HttpStatus.SC_OK) {
              Log.w(getClass().getSimpleName(),
                  "Error " + statusCode + " for URL " + url);
              return null;
           }
 
           HttpEntity getResponseEntity = getResponse.getEntity();
           return getResponseEntity.getContent();
            
        }
        catch (IOException e) {
           getRequest.abort();
           Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
        }
         
        return null;
         
     }
     
}

Во-первых, мы выполняем HTTP-запрос GET и извлекаем ресурс в виде потока (если вам нужна более подробная информация об этом, посмотрите мой предыдущий учебник Android Full App, часть 2. Использование HTTP API ). Мы создаем экземпляр Gson и используем его для выполнения анализа JSON и извлечения нашего объекта модели со всеми заполненными его полями.

Отредактируйте XML-файл манифеста Android и предоставьте разрешения для доступа в Интернет, а затем запустите конфигурацию Eclipse. Вы увидите уведомления о последних пользователях Twitter, которые твитнули о JavaCodeGeeks .

Вот и все, ребята, быстрый разбор JSON в Android с помощью Gson. Как всегда, вы можете скачать проект Eclipse, созданный для этого урока.

Удачного мобильного кодирования! Не забудьте поделиться!

Статьи по Теме:

Связанные фрагменты: