Статьи

Учебник по JSON для Android: создание и анализ данных JSON

В этом руководстве описывается, как использовать JSON с Android . JSON расшифровывается как (Java Script Object Notation). Это простой и легкий формат обмена данными, который может быть легко прочитан людьми и машинами. JSON — это текстовый формат, не зависящий от языка. Он представляет данные в текстовом формате, чтобы их можно было легко проанализировать.

Введение в JSON

JSON использует две разные структуры:

  • Коллекция пары имя / значение
  • массив

Первую структуру можно использовать для моделирования объекта, поскольку объект представляет собой набор атрибутов, которые содержат некоторые значения. Массив может использоваться для моделирования списка, массива объектов и так далее. Таким образом, используя эти две структуры, мы можем передавать данные между двумя машинами простым и эффективным способом. В последнее время JSON пользуется большим успехом, и большинство доступных API поддерживает формат JSON. Давайте посмотрим, как мы можем представлять данные в формате JSON.

Объект в JSON моделируется с помощью {..} , а его атрибуты можно моделировать с помощью name: value pair.Value, в свою очередь, может быть объектом, массивом или «простым» значением, например, примитивным значением (int, Строка, логическое значение и т. Д.).

Так что если у нас есть, например, класс Java, как:

1
2
3
4
5
6
public class Person {
 
    private String name;
    private String surname;   
       .....
}

это может быть представлено в JSON таким образом

1
2
3
4
{"surname":"Swa",
 "name":"Android",
  ....
}

Массив представлен в JSON с помощью [..]. Элемент массива может быть объектом, массивом и так далее.

Теперь мы знаем немного лучший формат JSON, мы можем начать использовать JSON с Android.

Использование JSON в Android

В Android и вообще во всех средах существует два типа операций:

  • Преобразовать Java-класс в данные JSON (Сериализация)
  • Разбор данных JSON и создание классов Java (десериализация)

Предположим, нам нужно отправить данные на удаленный сервер, используя HTTP-соединение, и данные представлены в классе Java. В качестве первого шага мы конвертируем класс Java в данные JSON. В качестве примера, давайте предположим, что у нас есть класс Person, подобный этому:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Person {
 
    private String name;
    private String surname;
    private Address address;
    private List<PhoneNumber> phoneList;
 
    // get and set
 
    public class Address {
        private String address;
        private String city;
        private String state;
        // get and set       
    }
 
    public class PhoneNumber {
        private String type;
        private String number;
 
        // get and set     
    }
}

Этот класс, как вы можете видеть, охватывает практически все типы объектов: есть строки, массив, внутренний класс и так далее. Как конвертировать его в JSON? Давайте создадим служебный класс.

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
public class JsonUtil {
 
public static String toJSon(Person person) {
      try {
        // Here we convert Java Object to JSON
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("name", person.getName()); // Set the first name/pair
        jsonObj.put("surname", person.getSurname());
 
        JSONObject jsonAdd = new JSONObject(); // we need another object to store the address
        jsonAdd.put("address", person.getAddress().getAddress());
        jsonAdd.put("city", person.getAddress().getCity());
        jsonAdd.put("state", person.getAddress().getState());
 
        // We add the object to the main object
        jsonObj.put("address", jsonAdd);
 
        // and finally we add the phone number
        // In this case we need a json array to hold the java list
        JSONArray jsonArr = new JSONArray();
 
        for (PhoneNumber pn : person.getPhoneList() ) {
            JSONObject pnObj = new JSONObject();
            pnObj.put("num", pn.getNumber());
            pnObj.put("type", pn.getType());
            jsonArr.put(pnObj);
        }
 
        jsonObj.put("phoneNumber", jsonArr);
 
        return jsonObj.toString();
 
    }
    catch(JSONException ex) {
        ex.printStackTrace();
    }
 
    return null;
 
}

Давайте проанализируем код. В строке 6 мы создаем новый объект JSON, он действует как контейнер наших данных. Затем мы помещаем пару имя / значение (строка 7-8). Как вы можете видеть, они соответствуют атрибуту класса Person. Глядя на строку 10 класса Person, мы отмечаем, что у нас есть внутренний класс, поэтому нам нужен еще один объект JSON для его повторного представления (строка 10-13). Когда мы построили наш объект JSON, мы поместили его в строку основного объекта 16. В строке 17 в нашем классе Person есть список телефонов. В этом случае нам нужен JSONArray для моделирования java List, и для каждого элемента в списке нам нужен JSON Object для его отображения. Запустив исходный код, доступный в конце этого поста, мы получим:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
{
   "phoneNumber": [
      {
         "type": "work",
         "num": "11111"
      },
      {
         "type": "home",
         "num": "2222"
      }
   ],
   "address": {
      "state": "World",
      "address": "infinite space, 000",
      "city": "Android city"
   },
   "surname": "Swa",
   "name": "Android"
}

Это наше JSON-представление нашего объекта Person. Я использовал хороший веб-сайт, который помогает тестировать данные JSON ( http://www.jsontest.com/ ). Как видно из результата, наши данные JSON верны:

android_json_tutorial [4]

Анализ данных JSON: десериализация

Еще один интересный аспект — анализ данных JSON и создание классов Java. Даже если существуют автоматические инструменты, которые создают классы POJO из данных JSON, важно знать, что стоит за ними. Когда у вас есть данные JSON, первым шагом является создание анализатора, который помогает получить значения внутри JSON.

1
JSONObject jObj = new JSONObject(data);

где данные содержат строку JSON. Теперь, глядя на файл данных JSON, мы можем начать извлечение данных. Например, если мы предполагаем, что мы получаем данные JSON, подобные показанным выше (см. Данные JSON Person), и мы хотим получить фамилию:

1
String surname = jObj.getString("surname");

Когда мы хотим получить адрес объекта, мы можем использовать:

1
2
3
JSONObject subObj = jObj.getJSONObject("address");
String city = subObj.getString("city");
...

Если мы хотим получить список телефонных номеров, мы просто имеем:

1
2
3
4
5
JSONArray jArr = jObj.getJSONArray("list");
for (int i=0; i < jArr.length(); i++) {
    JSONObject obj = jArr.getJSONObject(i);
    ....
}

Используя эти фрагменты кода, мы можем обрабатывать JSON в Android. Если вас интересует более сложный пример JSON, взгляните на приложение погоды для Android: JSON, HTTP и Openweathermap . Здесь объясняется, как создать полноценное приложение, которое получает текущие погодные условия.

Доступен исходный код @ github

Ссылка: Android JSON Tutorial: создавайте и анализируйте данные JSON от нашего партнера JCG Франческо Аццолы в блоге Surviving с Android .