JSON — это широко распространенный формат описания данных, используемый для обмена объектами JavaScript.
При реализации новой функциональности для OGL Explorer я обнаружил, что он довольно широко используется многими веб-API.
Поэтому сегодня я сосредоточусь на использовании такого рода данных в Java с помощью довольно хорошо сделанной библиотеки GSon .
Во-первых, вызовите сервис (простой GET с аргументами в URL), который предоставляет данные, это делается просто с помощью этого кода:
public static String call(String url) throws IOException { BufferedReader bis = null; InputStream is = null; try { URLConnection connection = new URL(url).openConnection(); is = connection.getInputStream(); // warning of UTF-8 data bis = new BufferedReader(new InputStreamReader(is, "UTF-8")); String line = null; StringBuffer result = new StringBuffer(); while ((line = bis.readLine()) != null) { result.append(line); } return result.toString(); } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Примечание: мы используем InputStreamReader ( «UTF-8» ) для правильного управления данными UTF-8, которые мы получим на некоторых японских, французских или других экзотических языках.
Хорошо, результатом String будет что-то, например, вот так:
{ "first-name": "John", "last-name": "Smith", "age": 25, "address": { "street-address": "21 2nd Street", "city": "New York", "state": "NY", "postal-code": "10021" }, "phone-number": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }
Для обработки этой строки мы будем использовать магический GSon.
Библиотека GSon попытается проанализировать строку в формате JSon и отобразить данные на заданный Java Person Object. GSon использовал отражение, чтобы сделать такой трюк, поэтому типы атрибутов и имена целевого Java-объекта должны быть сопоставимы со структурой строк JSon.
В предыдущем примере объект Person должен иметь структуру, соответствующую объекту JSon, то есть будет иметь 5 атрибутов с именами «имя», «фамилия», «возраст», «адрес», и «номер телефона».
Прежде всего, то, что мы видим здесь, это то, что атрибут не может быть назван по имени в Java, потому что символ ‘-‘ не разрешен в именах атрибутов java. Нет проблем, мы объявим атрибут firstName и укажем, что это сериализованный идентификатор JSon с именем «first-name» с помощью аннотации @SerializedName .
Мы получим атрибут, объявленный так:
@SerializedName("first-name") private String firstName;
Конечно, тот же трюк применяется для атрибута «фамилия».
Возраст просто объявляется как int, здесь мы сохраняем одно и то же имя атрибута в JavaScript и в Java:
private int age;
Хорошо, теперь адрес, который является сложным объектом (мы можем видеть его с помощью {…}, который представляет структуру.
Поэтому мы сопоставим его с адресом объекта Java, который следует тому же принципу, что и выше, что дает нам:
private class Address { @SerializedName("street-address") private String streetAddress; private String city; private String state; @SerializedName("postal-code") private int postalCode; }
Оставайтесь номера телефонов, здесь […] символы указывают на то, что мы имеем дело с коллекциями объектов.
Затем мы сопоставим его с java.util.List объектов PhoneNumber, как показано ниже:
@SerializedName("phone-number") private List<PhoneNumber> phoneNumber;
Где PhoneNumber — это заданный объект:
private class PhoneNumber { private String type; private String number; }
Итак, теперь наш Object Person завершен и выглядит так:
private class Person { @SerializedName("first-name") private String firstName; @SerializedName("last-name") private String lastName; private int age; private Address address; @SerializedName("phone-number") private List<PhoneNumber> phoneNumber; }
Мы сделали. Вызов Gson создаст экземпляр Java-объекта Person и заполнит его потоком.
Person data = new Gson().fromJson(json, Person .class);
Это дает нам: