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);
Это дает нам:
