В этот раз затронем очень интересную для меня тему - язык Java. Мне нравится данный объектно-ориентированный язык программирования, мне нравится писать на нем программы. Это очень приятный инструмент, который появился примерно в 1995 году с целью стать простым, но очень мощным кроссплатформенным языком программирования. Написав однажды программы - вы сможете запустить ее на любом устройстве (если, конечно, на нем есть специальная виртуальная машина, которая выполняет ваш код).
В данный момент я активно изучаю именно Java, поэтому время от времени я буду что-нибудь писать именно про этот язык. И вот, на данный момент, этот один из случаев настал.
Те, кто хоть когда-нибудь разрабатывал сетевое приложение, писал свой простенький сетевой протокол, возможно, сталкивался с тем, что передавать данные в виде примитивов - задача не самая приятная. Хотя Java очень упрощает данный процесс и в некоторых случаях передача простого int'a или строки - решит проблему. Но когда мы гоняем более крупные информационные блоки, уже хочется более удобный инструмент для "архивации" данных, а точнее для сериализации объектов.
Такую возможность предоставляет специальные форматы данных, которые были изобретены именно для этого. Существует два крупных инструмента для этой задачи: XML и JSON. Что точно это такое, вы можете найти в сети. Мы же поговорим о более прикладных вещах. В стандартных библиотеках Java имеется поддержка формата XML - то есть вы спокойно можете работать с этим форматом данных "из под коробки". Но, как на мой взгляд, во многих случаях XML менее удобен, поэтому появился совсем простой формат - JSON, который основан на JavaScript. По факту - это обычный набор строк, которые особым образом устроены и структурированы для удобного парсинга данных.
В своих проектах я часто использую именно JSON, как я выше уже написал, но пока в стандартных библиотеках данный формат в Java не поддерживается. Поэтому приходится использовать сторонние библиотеки, про одну из которых я сейчас расскажу. Json-simple - библиотека, которую, на данный момент, я чаще всего использую. Из названия - она простая, она про JSON - то что нам нужно.
Библиотека представляет из себя один .jar файл, который легко подключается к проекту (в Eclipse подключается просто: Project - Properties - Java Build Path - Add JARs / Add External JARs). После подключения можно сразу приступать к работе. Что нас интересует - это сохранение данных в JSON и чтения данных из JSON. Вот так выглядит типичный JSON объект:
1 2 3 4 5 6 7 8 9 |
{ "idArr":[5,10,3], "guild":"BestQuarksOfUniverse", "objectName":"Player", "coords":{ "x":25.1, "y":50.5 } } |
С этим примером и будем работать. Допустим, эти данные находятся в файле example.json. Я лишь приведу несколько методов для работы с библиотекой для чтения и создания JSON строк.
Начнем с десериализации, с парсинга. Так выглядит чтение из файла JSON данных и создания объекта для работы с этими данными:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
StringBuilder jsonStrBuilder = new StringBuilder(); Scanner inputScanner; try{ inputScanner = new Scanner(new File("example.json")); while(inputScanner.hasNext()) // Цикл чтения из файла jsonStrBuilder.append(inputScanner.next()); inputScanner.close(); } catch(FileNotFoundException e){ System.err.println(e.toString()); } JSONParser jsonParser = new JSONParser(); JSONObject resultJson; // Объект со всеми данными из JSON файла try{ resultJson = (JSONObject) jsonParser.parse(jsonStrBuilder.toString()); } catch(ParseException e){ System.err.println(e.toString()); } |
В итоге мы получаем объект resultJson библиотечного класса JSONObject, в котором и лежат вся информация. Как видно из вышенаписанного кода, данный объект создается с помощью объекта класса JSONParser - через автоматический парсер. Все, теперь можно вытаскивать информацию, либо снова приводить объект resultJson к строке (с помощью метода toString() ) и передавать его, например, по сети. Доступ к данным прост, работает с явным приведением типов, поскольку метод get() возвращает Object. Выглядит следующим образом:
1 2 3 4 5 6 7 8 |
resultJson = (JSONObject) jsonParser.parse(jsonStrBuilder.toString()); String objName = (String) resultJson.get("objectName"); // Получаем обычные строковые данные String objGuild = resultJson.get("guild").toString(); // Другой способ получить строку ArrayList arr = (ArrayList) resultJson.get("idArr"); // Получаем массив JSONObject coordsArr = (JSONObject) resultJson.get("coords"); // Получаем сложную JSON структуру double objX = (double) coordsArr.get("x"); // Берем координаты из этой структуры double objY = (double) coordsArr.get("y"); // Явное приведение к нужному примитивному типу |
Теперь посмотрим обратный процесс - создание JSON структуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
JSONObject outputJson = new JSONObject(); outputJson.put("objectName", "Player"); // Сохраняем строку outputJson.put("guild", "BestQuarksOfUniverse"); JSONObject coordArr = new JSONObject(); coordArr.put("x", 25.1d); coordArr.put("y", 50.5d); outputJson.put("coords", coordArr); // Сохраняем сложную структуру ArrayList idArr = new ArrayList(); // Если хотим сохранить коллекцию в JSON idArr.add(new Integer(5)); idArr.add(new Integer(10)); JSONArray idArrJson = new JSONArray(); // Создаем объект JSON массива idArrJson.addAll(idArr); // Сохраняем наш объект, который реализует интерфейс Collection<> idArrJson.add(new Integer(3)); // Добавим еще один элемент в массив outputJson.put("idArr", idArrJson); // Сохраним массив в JSON |
Как видно, используется по сути только метод put(). В итоге получается следующая вещь:
1 2 3 4 5 6 7 8 9 |
{ "idArr":[5,10,3], "guild":"BestQuarksOfUniverse", "objectName":"Player", "coords":{ "x":25.1, "y":50.5 } } |
Этого функционала достаточно для большинства простых прикладных задач, так что пользуйтесь! Скачать библиотеку можно с официальной страницы проекты: https://code.google.com/p/json-simple/