Android. Работа с JSON

JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком.

Как и многие другие текстовые форматы, JSON легко читается людьми. Формат JSON был разработан Дугласом Крокфордом. Несмотря на происхождение от JavaScript, формат считается языконезависимым и может использоваться практически с любым языком программирования.

Википедия

 

В Android есть готовые классы для работы с JSON:

JSONObject, JSONArray, JSONWriter, JSONStringer и т. д. В той статье мы рассмотрим все методы классов JSONObject и JSONArray и приведем примеры их использования.

Объект в JSON имеет такой вид:

{"ключ":значение, "ключ": значение}

Пример:

{"name":"Иван", "surname":"Иванов", "age":40, "married":true}

А вот так выглядит массив:

["значение", "значение"]

Пример:

["Петр", "Иван", "Сергей"]

Тип ключа всегда должен быть строкой, а тип значения может быть строкой, числом, true, false, null, объектом или массивом.

JSONObject

Собственно сам класс, в котором хранятся пары ключ/значение.

Методы класса JSONObject:

JSONObject() — конструктор класса, создает пустой объект класса JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();

JSONObject(String source) — конструктор класса, создает JSONObject из строки.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"name":"Иван"}");
} catch (JSONException e){}

JSONObject(Map mapsource) — конструктор класса, создает JSONObject из объекта классаMap.

Пример:

getBoolean(String key) — ищет значение по ключу и возвращает boolean, если оно есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"result":true}");
 boolean result = jsonObject.getBoolean("result");
 Log.d("json", json);
 Log.d("json", "Результат: " + result);
} catch (JSONException e){}

getDouble(String key) — ищет значение по ключу и возвращает double, если оно есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"dollar":54.48}");
 double dollar = jsonObject.getDouble("dollar");
 Log.d("json", json);
 Log.d("json", "Курс доллара: " + dollar);
} catch (JSONException e){}

getInt(String key) — ищет значение по ключу и возвращает int, если оно есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"age":33}");
 int age = jsonObject.getInt("age");
 Log.d("json", json);
 Log.d("json", "Возраст " + age);
} catch (JSONException e){}

getLong(String key) — ищет значение по ключу и возвращает long, если оно есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"price":1999999999}");
 long price = jsonObject.getLong("price");
 Log.d("json", json);
 Log.d("json", "Цена " + price);
} catch (JSONException e){}

getString(String key) — ищет строку по ключу и возвращает ее, если она есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"name":"Елена"}");
 String name = jsonObject.getString("name");
 Log.d("json", json);
 Log.d("json", "Имя " + name);
} catch (JSONException e){}

getJSONArray(String key) — ищет значение по ключу и возвращает объект класса JSONArray, если он есть.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{pupils":["Василий Ломоносов","Александр Пушкин","Сергей Есенин","Агния Барто","Владимир Маяковский"]}");
 JSONArray jsonArray = jsonObject.getJSONArray("pupils");
} catch (JSONException e){}

getJSONObject(String key) — ищет значение по ключу и возвращает объект класса JSONObject, если он есть.

Пример:

try{
  JSONObject jsonObject = new JSONObject("{"lada_car":{"type":"седан","model":"Kalina","manufacturer":"Lada"},"toyota_car":{"type":"седан","model":"Camry","manufacturer":"Toyota"}}");

  JSONObject kalina = jsonObject.getJSONObject("lada_car");

  Log.d("json", kalina.getString("manufacturer"));
  Log.d("json", kalina.getString("model"));
  Log.d("json", kalina.getString("type"));

  JSONObject camry = jsonObject.getJSONObject("toyota_car");

  Log.d("json", camry.getString("manufacturer"));
  Log.d("json", camry.getString("model"));
  Log.d("json", camry.getString("type"));

  String json = jsonObject.toString();
  Log.d("json", json);

} catch (JSONException e){}

 

getNames(JSONObject jo) — статический метод класса JSONObject, возвращает массив имен, которые содержит объект.

Пример:

try{
 JSONObject jsonObject = new JSONObject("{"petr":"Петр","ivan":"Иван"}");
 String[] jsonNames = jsonObject.getNames();
 Log.d("json", json);
 for (int i = 0; i < jsonNames.length; i++){
  Log.d("json", jsonNames[i]);
 }
} catch (JSONException e){}

has(String key) — проверяет, содержит ли объект указанный ключ.

Пример:

JSONObject jsonObject = new JSONObject();
try{
 String name = "Иван";
 jsonObject.put("name", name);
 String json = jsonObject.toString();
 boolean nameExists = jsonObject.has("name");
 boolean surnameExists = jsonObject.has("surname");
 Log.d("json", json);
 Log.d("json", "Имя:"+ nameExists + ", Фамилия:" + surnameExists);
} catch (JSONException e){}

isNull(String key) — проверяет, является ли значение найденное по ключу null.

Пример:

JSONObject jsonObject = new JSONObject();
try{
 jsonObject.put("name", JSONObject.NULL);
 String json = jsonObject.toString();
 Log.d("json", json);
 Log.d("json", "name = null: " + jsonObject.isNull("name"));
} catch (JSONException e){}

 

length() — возвращает количество имен в объекте.

Пример:

JSONObject jsonObject = new JSONObject();
try{
 String name = "Иван";
 String surname = "Иванов";
 jsonObject.put("name", name);
 jsonObject.put("surname", surname);
 String json = jsonObject.toString();
 Log.d("json", json);
 Log.d("json", "Количество элементов = " + jsonObject.length());
} catch (JSONException e){}

put(String key, double value) — вставляет пару ключ/double в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 double age = 40;
 jsonObject.put("age", age);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

put(String key, int value) — вставляет пару ключ/int в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 int age = 40;
 jsonObject.put("age", age);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

put(String key, long value) — вставляет пару ключ/long в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 long age = 40;
 jsonObject.put("age", age);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

put(String key, String value) — вставляет пару ключ/строка в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 String name = "Иван";
 jsonObject.put("name", name);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

put(String key, Collection value) — вставляет пару ключ/строка в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject();
ArrayList<String> array = new ArrayList<String>();
array.add("Иван");
array.add("Петр");

try{
 jsonObject.put("array", array);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

put(String key, Map value) — вставляет пару ключ/строка в JSONObject.

Пример:

JSONObject jsonObject = new JSONObject(); 
Map<String, String> map = new LinkedHashMap(); 
map.put("name", "Иван"); map.put("surname", "Иванов"); 

try{ 
 jsonObject.put("map", map); 
 String json = jsonObject.toString(); 
 Log.d("json", json); 
}catch(JSONException e{}

remove(String key) — удаляет пару ключ/значение в JSON-объекте, если она там есть.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 String ivan = "Иван";
 String petr = "Петр";
 jsonObject.put("ivan", name);
 jsonObject.put("petr", name);
 jsonObject.remove("petr")
 String json = jsonObject.toString();
} catch (JSONException e){}

toString() — возвращает JSON-объект в виде строки.

Пример:

JSONObject jsonObject = new JSONObject();

try{
 String name = "Иван";
 jsonObject.put("name", name);
 String json = jsonObject.toString();
} catch (JSONException e){}
Создание JSON

Представим, что у нас есть школьный класс из 5 человек и учитель:

String teacher = "Елена Ивановна"; String[] pupils = {"Василий Ломоносов", "Александр Пушкин", "Сергей Есенин", "Агния Барто", "Владимир Маяковский"};

Переведем эту информацию в JSON:

JSONObject schoolClass = new JSONObject();
JSONArray pupilsArray = new JSONArray();

String json;

try{
 schoolClass.put("teacher", teacher);
 schoolClass.put("pupils_count", pupils.length);

 for (int i = 0; i < pupils.length; i++){
  pupilsArray.put(pupils[i]);
 }

 schoolClass.put("pupils", pupilsArray);
 json = schoolClass.toString();
} catch (JSONException e){}

Log.d("classInJson", json);

Результат:

{"teacher":"Елена Ивановна","pupils":["Василий Ломоносов","Александр Пушкин","Сергей Есенин","Агния Барто","Владимир Маяковский"],"pupils_count":5}

Теперь попробуем перевести JSON-строку обратно:

try{
 JSONObject schoolClassFromJson = new JSONObject(json);
 String teacherFromJson = schoolClassFromJson.getString("teacher");

 Log.d("schoolClass", "Учитель:"+ teacherFromJson);
 Log.d("schoolClass", "Ученики:");

 JSONArray pupilsJsonArray = schoolClass.getJSONArray("pupils");
 String[] pupilsFromJson = new String[schoolClassFromJson.getInt("pupils_count")];

 for (int i = 0; i < pupilsJsonArray.length(); i++){
  pupilsFromJson[i] = pupilsJsonArray.getString(i);
  Log.d("schoolClass", pupilsFromJson[i]);
 }

}catch (JSONException e)
{}

JSONArray

JSONArray() — создает пустой объект класса JSONArray.
Пример:

JSONArray jsonArray = new JSONArray();

JSONArray(Collection collection) — создает объект класса JSONArray из коллекции.
Пример:

ArrayList arrayList = new ArrayList();
arrayList.add("Василий Ломоносов");
arrayList.add("Александр Пушкин");
arrayList.add("Сергей Есенин");
arrayList.add("Агния Барто");
arrayList.add("Владимир Маяковский");
JSONArray jsonArray = new JSONArray(arrayList);

JSONArray(String source) — создает объект класса JSONArray из коллекции.
Пример:

try{
 JSONArray jsonArray = new JSONArray("[\"Василий Ломоносов\",\"Александр Пушкин\",\"Сергей Есенин\",\"Агния Барто\",\"Владимир Маяковский\"]");
} catch (JSONException e){}

getBoolean(int index) — ищет значение типа boolean по индексу и возвращает его.

try{
  JSONArray jsonArray = new JSONArray("[true,false,false]");
  boolean b = jsonArray.getBoolean(0);
}catch (JSONException e){}

getDouble(int index) — вставляет значение типа double в массив.

try{
  JSONArray jsonArray = new JSONArray("[18.12,19.45,20.01]");
  double d = jsonArray.getDouble(0);
}catch (JSONException e){}

getInt(int index) — ищет число по индексу и возвращает его.

try{
  JSONArray jsonArray = new JSONArray("[10,50,99]");
  int i = jsonArray.getInt(0);
}catch (JSONException e){}

getJSONArray(int index)
Пример:

try{
  JSONObject jsonObject = new JSONObject("{\"array\":[\"Вася\",\"Петя\",\"Коля\",\"Миша\"]}");
  JSONArray jsonArray = jsonObject.getJSONArray("array");
}catch (JSONException e){}

getJSONObject(int index) — ищет JSON-объект по индексу и возвращает его.
Пример:

try{
  JSONArray jsonArray = new JSONArray("[{\"name\":\"Вася\"},{\"name\":\"Коля\"}]");
  JSONObject jsonObject = jsonArray.getJSONObject(1);
}catch (JSONException e){}

getLong(int index) — ищет число по индексу и возвращает его.
Пример:

try{
  JSONArray jsonArray = new JSONArray("[10,50,99]");
  long i = jsonArray.getLong(0);
}catch (JSONException e){}

getString(int index) — ищет строку по индексу и возвращает ее.
Пример:

JSONArray jsonArray = new JSONArray("[\"Андрей\",\"Аркадий\",\"Борис\"]");
String name = jsonArray.getString(1); //переменная name равна Аркадий

isNull(int index) — проверяет, является ли значение null и возвращает boolean.
Пример:

JSONArray jsonArray = new JSONArray("[\"Андрей\",null,\"Борис\"]");
boolean b = jsonArray.isNull(1); //переменная b равна true

length() — возвращает длину массива.
Пример:

JSONArray jsonArray = new JSONArray("[\"One\",\"Two\",\"Three\"]");
int arraySize = jsonArray.length();

put(boolean value)

JSONArray jsonArray = new JSONArray();
boolean b = true;
jsonArray.put(b);

put(Collection value)
Пример:

JSONArray jsonArray = new JSONArray();
ArrayList arrayList = new ArrayList();
arrayList.add("Александр");
arrayList.add("Андрей");
arrayList.add("Аркадий");
jsonArray.put(arrayList);
et.setText(jsonArray.toString());

put(double value) — вставляет значение типа double в массив.
Пример:

JSONArray jsonArray = new JSONArray();
double d = 9.9;
jsonArray.put(d);

put(int value) — вставляет значение типа int в массив.
Пример:

JSONArray jsonArray = new JSONArray();
int i = 10;
jsonArray.put(i);

put(long value) — вставляет значение типа long в массив.
Пример:

JSONArray jsonArray = new JSONArray();
long l = 999999999;
jsonArray.put(l);

put(int index, boolean value) — вставляет значение типа boolean в массив по указанному индексу.
Пример:

JSONArray jsonArray = new JSONArray();
boolean b = true;
jsonArray.put(0, b);

put(int index, Collection value)
Пример:

JSONArray jsonArray = new JSONArray();
ArrayList arrayList = new ArrayList();
arrayList.add("Александр");
arrayList.add("Андрей");
arrayList.add("Аркадий");
jsonArray.put(arrayList);
et.setText(2, jsonArray.toString());

put(int index, double value) —  — вставляет значение типа double в массив по указанному индексу.
Пример:

JSONArray jsonArray = new JSONArray();
double d = 9.9;
jsonArray.put(3, d);

put(int index, int value) — вставляет значение типа int в массив по указанному индексу.

JSONArray jsonArray = new JSONArray(); 
int i = 10; 
jsonArray.put(i);

put(int index, long value) —  вставляет значение типа long в массив по указанному индексу.
Пример:

JSONArray jsonArray = new JSONArray();
long l = 999999999;
jsonArray.put(5, l);

remove(int index) — удаляет значение из массива по индексу.
Пример:

JSONArray jsonArray = new JSONArray("[\"One\",\"Two\",\"Three\"]");
jsonArray.remove(1); //удалится запись "Two", т. к. нумерация записей начинается с нуля

toJSONObject(JSONArray names) — представляет JSONArray в виде JSONObject. На вход подается массив имен.
Пример:

try{
JSONArray jsonArray = new JSONArray("[\"Иван\",\"Иванов\"]");
JSONArray names = new JSONArray("[\"name\",\"surname\"]");
JSONObject jsonObject = jsonArray.toJSONObject(names);
}catch (JSONException e){}

toSring() — возвращает строковое представление объекта.
Пример:

JSONArray jsonArray = new JSONArray("["Hello","World"]");
String json = jsonArray.toString();

Передаем null в значении

Если в значении вам нужно передать null, то во время вставки в поле значения нужно предать статическую переменную класса JSONObect — NULL

Пример:

JSONObject jsonObject = new JSONObject();

try{
 jsonObject.put("null", JSONObject.NULL);
 String json = jsonObject.toString();
 Log.d("json", json);
} catch (JSONException e){}

Комментарии:

4 comments

  1. Andrey Reply

    В Android Studio нет метода getNames(JSONObject jo)
    Есть метод names(JSONObject jo) — суть та же, но возвращает не массив, а коллекцию JSONArray

  2. Андрей Reply

    Верно указано про getNames(). Еще интересно было бы рассмотреть пример с двумя и более объектами JSON внутри одного.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

1 + 5 =