Статьи

JSon GSon

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);  

Это дает нам:
JSON

 

От http://lewisleo.blogspot.jp/2012/08/json-gson.html