Этой статьей я начну серию публикаций по работе с JSON в Java. Для начала пройдусь по знакомым и простым решениям, а затем перейду к продвинутым библиотекам. Примером «простых решений» сегодня будет работа с Json Simple, а именно парсинг (разбор) существующего JSON объекта и создание нового.
Обзор Json Simple API
Json Simple — представляет собой простой API для обработки JSON. Сам API состоит из около 13 классов, основу которых составляют следующие 5 классов:
- Класс
JSONParser
предназначен для разбора строки с JSON-содержимым. Он принимает объектjava.io.Reader
или строку. - Класс
JSONObject
— это Java представление JSON строки. Класс JSONObject наследует HashMap и хранит пары ключ — значение. Также у него есть очень полезный метод writeJSONString(Map map, Writer out), который используется для конвертации мапы в JSON строку. - Класс
JSONArray
представляет собой коллекцию. Он наследует ArrayList и реализует интерфейсыJSONAware
иJSONStreamAware
. JSONValue
— класс для парсинга JSON строки в Java объекты. Для этого он использует класс JSONParser. JSONValue содержит множество полезных методов для создания JSON из различных типов, например, метод writeJSONString(Object value, Writer out) создаст JSON-строку из Java объекта. Он также имеет методы для работы со специальными (управляющими) символами используя метод escape(String s). С помощью этого метода можно безопасно работать с кавычками «» и такими символами, как \f, \t, \n, \, /, \r, \b и многими другими.- Интерфейс
JSONAware
. Класс должен реализовывать этот интерфейс, чтобы конвертироваться в JSON формат.
Json Simple API. Пример разбора JSON строки и создания нового JSON объекта
Ниже описан пример парсинга строки с JSON содержимым, а именно текущей погоды в каком-то городе. Я использовал сервис Openweathermap.org для получения данных о погоде.
Если Вы хотите просто попробовать JSON Simple API в действии и не хотите заморачиваться над получением этих данных с какого-то сервиса, то просто скопируйте полученный JSON по этой ссылке: openweather и используйте его в виде обычной строки в Java.
Создание maven проекта
Для удобства я создал простой maven проект в Intellij IDEA и добавил в зависимости последнюю версию json-simple в файле pom.xml:
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
|
Теперь перейдем к созданию класса JsonUtils, в котором будут все необходимые методы для парсинга готового json в виде строки и создания нового Json содержимого.
1
2
3
4
5
6
7
8
9
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
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package ua.com.prologistic.app;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class JsonUtils {
/**
* Метод для получения данных по указанной ссылке
*
* @param url - ссылка в виде объекта URL (Uniform Resource Locator)
* @return содержимое страницы на указанной ссылке в @param url
*/
public static String parseUrl(URL url) {
if (url == null) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
// открываем соедиение к указанному URL
// помощью конструкции try-with-resources
try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) {
String inputLine;
// построчно считываем результат в объект StringBuilder
while ((inputLine = in.readLine()) != null) {
stringBuilder.append(inputLine);
System.out.println(inputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
// парсим некоторые данные о погоде
public static void parseCurrentWeatherJson(String resultJson) {
try {
// конвертируем строку с Json в JSONObject для дальнейшего его парсинга
JSONObject weatherJsonObject = (JSONObject)JSONValue.parseWithException(resultJson);
// получаем название города, для которого смотрим погоду
System.out.println("Название города: " + weatherJsonObject.get("name"));
// получаем массив элементов для поля weather
/* ... "weather": [
{
"id": 500,
"main": "Rain",
"description": "light rain",
"icon": "10d"
}
], ... */
JSONArray weatherArray = (JSONArray) weatherJsonObject.get("weather");
// достаем из массива первый элемент
JSONObject weatherData = (JSONObject) weatherArray.get(0);
// печатаем текущую погоду в консоль
System.out.println("Погода на данный момент: " + weatherData.get("main"));
// и описание к ней
System.out.println("Более детальное описание погоды: " +weatherData.get("description"));
} catch (org.json.simple.parser.ParseException e) {
e.printStackTrace();
}
}
// формируем новый JSON объект из нужных нам погодных данных
public static String buildWeatherJson() {
// для простоты примера просто хардкодим нужные данные в методе
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "Лондон");
jsonObject.put("main", "Солнечно");
jsonObject.put("description", "Мороз трескучий, На небе ни единой тучи");
return jsonObject.toJSONString();
}
// создаем объект URL из указанной в параметре строки
public static URL createUrl(String link) {
try {
return new URL(link);
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
}
}
|
Теперь создадим Main класс для работы с утилитным методом парсинга и создания json:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package ua.com.prologistic.app;
import java.net.URL;
public class Main {
/**
* Для простоты и удобства используем уже сформированную строку
* с запросом погоды в Лондоне на данный момент
* <p>
* другие примеры запросов можете глянуть здесь
* {@see <a href="http://openweathermap.org/current">openweathermap</a>}
* также Вам понадобится свой API ключ
*/
public static final String WEATHER_URL =
"http://api.openweathermap.org/data/2.5/weather?q=London,uk" +
"&units=metric&appid=241de9349721df959d8800c12ca4f1f3";
public static void main(String[] args) {
// создаем URL из строки
URL url = JsonUtils.createUrl(WEATHER_URL);
// загружаем Json в виде Java строки
String resultJson = JsonUtils.parseUrl(url);
System.out.println("Полученный JSON:\n" + resultJson);
// парсим полученный JSON и печатаем его на экран
JsonUtils.parseCurrentWeatherJson(resultJson);
// формируем новый JSON объект из нужных нам погодных данных
String json = JsonUtils.buildWeatherJson();
System.out.println("Созданный нами JSON:\n" + json);
}
}
|
В ходе работы с Json Simple API по этому примеру у Вас могут возникнуть такие сложности:
- Если запрос на погодный сервис не проходит, то замените API ключ, который используется в примере, на свой.
- Если у Вас проблема с maven проектом, то можно создать простой Java проект идобавить вручную jar библиотеку Json Simple.
Теперь запустим приложение и посмотрим на результат выполнения в консоль:
Полученный JSON:
{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":521,"main":"Rain","description":"shower rain","icon":"09d"}],"base":"stations","main":{"temp":20.48,"pressure":1013,"humidity":64,"temp_min":18,"temp_max":23},"visibility":10000,"wind":{"speed":6.2,"deg":220},"rain":{"1h":0.2},"clouds":{"all":75},"dt":1472401589,"sys":{"type":1,"id":5091,"message":0.0429,"country":"GB","sunrise":1472360901,"sunset":1472410403},"id":2643743,"name":"London","cod":200}
Название города: London
Погода на данный момент: Rain
Более детальное описание погоды: shower rain
Созданный нами JSON:
{"name":"Лондон","description":"Мороз трескучий, На небе ни единой тучи","main":"Солнечно"}
|
В этой статье мы познакомились с простым способом парсинга/создания json, а в следующих статьях Вас ждут другие более удобные и популярные способы обработки json.
Скачать проект можно по этой ссылке.
Подписывайтесь на обновления и следите за новыми статьями!
Смотри также:
- Зачем нужна Java. http://fetisovvs.blogspot.com/2014/07/java.html
- Что помогло языку Java «войти в каждый дом». http://fetisovvs.blogspot.com/2016/07/java-java.html
- Как вы можете сделать Java лучше. http://fetisovvs.blogspot.com/2016/05/apache-poi-microsoft-office-java-java.html
- Двести пятьдесят русскоязычных обучающих видео докладов и лекций о Java. http://fetisovvs.blogspot.com/2015/12/java-5-java-java.html
- Integer и int. http://fetisovvs.blogspot.com/2016/07/integer-int-java.html
- Ввод–вывод в Java. http://fetisovvs.blogspot.com/2016/05/java-java_28.html
- Шпаргалка Java программиста 7.1 Типовые задачи: Оптимальный путь преобразования InputStream в строку. http://fetisovvs.blogspot.com/2016/04/java-71-inputstream-java.html
- Шпаргалка Java программиста 8. Библиотеки для работы с Json (Gson, Fastjson, LoganSquare, Jackson, JsonPath и другие). http://fetisovvs.blogspot.com/2016/04/java-8-json-gson-fastjson-logansquare.html
- Как установить соединение с СУБД MySQL в IntelliJ IDEA в редакции Community. http://fetisovvs.blogspot.com/2016/04/mysql-intellij-idea-community-java.html
- Работа с Bluetooth LE из Java-приложений. http://fetisovvs.blogspot.com/2016/07/bluetooth-le-java-java.html
- Программируем… выход из лабиринта. http://fetisovvs.blogspot.com/2015/10/java.html
- Игра на чистой Java от новичка, для новичков. http://fetisovvs.blogspot.com/2015/09/java-java.html
Ну что можно сказать. Г..авно парсер JSON для Java и ясно, что он никак не клеится к JSON. Выцарапывать из строки поля объекта ? Чего, трудно заглянуть в исходники на пыхе ? где нормальная автоматизация? даже приклеить полученный JSONObject к созданному JAVA-классу не получается. Короче, раздувайте зябры пошире, ёршики.
ОтветитьУдалить