Рубрики
Без рубрики

Синтаксический анализ вложенных объектов Json в Android

В идеальном мире я бы хотел, чтобы Api-интерфейсы содержали данные в простом формате, но поскольку это не так… С тегами android, java, модернизация.

В идеальном мире я бы хотел, чтобы Api-интерфейсы содержали данные в простом формате, но поскольку это не идеальный мир и желания не являются лошадьми, это не всегда так. Некоторые варианты использования оправдывают необходимость использования сложных форматов данных. В этом блоге мы собираемся создать приложение для Android, которое анализирует вложенные объекты Json из веб-службы и отображает их в приложении.

Мы будем использовать Jsonplaceholder fake API в качестве нашего внешнего источника данных и эти две библиотеки:

  1. Retrofit – типобезопасный http-клиент для Android, который мы будем использовать для совершения сетевых вызовов из нашего приложения.
  2. GSON – Библиотека сериализации/десериализации Java для преобразования объектов JSON в Java.

Настройка проекта

Создайте новый проект в android studio, используя пустой шаблон Activity. Когда приложение завершит сборку, добавьте эти зависимости в build.gradle и перестройте свой проект.

 implementation 'com.squareup.retrofit2:retrofit:2.6.0'
 implementation 'com.squareup.retrofit2:converter-gson:2.6.0'

API-интерфейс JSONPlaceholder

Этот сервис предлагает поддельный онлайн-REST API для тестирования и создания прототипов. Это бесплатный сервис, поэтому нам не нужен ключ api для использования. Вы можете посетить их сайт для получения дополнительной информации об API.

Это данные, которые мы будем анализировать из конечной точки API , информация о поддельном пользователе.

{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
    "street": "Kulas Light",
    "suite": "Apt. 556",
    "city": "Gwenborough",
    "zipcode": "92998-3874",
    "geo": {
        "lat": "-37.3159",
        "lng": "81.1496"
    }
 },
 "phone": "1-770-736-8031 x56442",
 "website": "hildegard.org",
 "company": {
      "name": "Romaguera-Crona",
      "catchPhrase": "Multi-layered client-server neural-net",
      "bs": "harness real-time e-markets"
       }
 }

Первый объект состоит из 8 предметов:

  • "удостоверение личности"
  • "имя"
  • "имя пользователя"
  • "электронная почта"
  • "адрес"
  • "телефон"
  • "веб-сайт"
  • "компания"

"адрес" и "компания" являются вложенными объектами . Объект "address" состоит из пяти элементов, последний элемент "geo" еще один вложенный объект.

Пойос

Чтобы успешно проанализировать все эти объекты, нам нужно создать их последующие простые старые объекты Java (Pojo). Для этого мы сначала создадим классы, которые будем использовать в качестве чертежей для pojos.

Давайте начнем с самого вложенного объекта (geo). Создайте новый класс Java и назовите его геолокацией адреса пользователя и заполните его его элементами.

public class UserAddressGeoLocation {
    @SerializedName("lat")
    private String latitude;

    @SerializedName("lng")
    private String longitude;

    public String getLatitude() {
        return latitude;
    }

    public String getLongitude() {
        return longitude;
    }
}

Если есть красные линии, щелкните по ним и нажмите alt+enter, чтобы импортировать библиотеку SerializedName . Мы используем аннотацию SerializedName, потому что мы изменили имена; сжиженный природный газ и широта с долготой и широта соответственно. Долгота и широта – лучшие описательные имена переменных, вам не кажется? Мы будем использовать геттеры для доступа к соответствующим элементам. Мы переходим к следующим наиболее вложенным объектам, адрес и компания .

Создайте новый класс Java, назовите его User Address и заполните его его элементами.

public class UserAddress {
    private String street;

    private String suite;

    private String city;

    @SerializedName("zipcode")
    private String zipCode;

    private UserAddressGeoLocation geo;

    public String getStreet() {
        return street;
    }

    public String getSuite() {
        return suite;
    }

    public String getCity() {
        return city;
    }

    public String getZipCode() {
        return zipCode;
    }

    public UserAddressGeoLocation getGeo() {
        return geo;
    }
}

Последним элементом этого класса (geo) является объект типа User Address GeoLocation (класс, который мы создали на предыдущем шаге).

Создайте другой класс Java, назовите его User Company и заполните его своими элементами

public class UserCompany {
    private String name;

    private String catchPhrase;

    private String bs;

    public String getName() {
        return name;
    }

    public String getCatchPhrase() {
        return catchPhrase;
    }

    public String getBs() {
        return bs;
    }
}

Теперь у нас остался только наименее вложенный объект. Создайте новый класс Java, назовите его Users и заполните его элементами.

public class Users {
    private int id;

    private String name;

    @SerializedName("username")
    private String userName;

    private String email;

    private UserAddress address;

    private String phone;

    private String website;

    private UserCompany company;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getUserName() {
        return userName;
    }

    public String getEmail() {
        return email;
    }

    public UserAddress getAddress() {
        return address;
    }

    public String getPhone() {
        return phone;
    }

    public String getWebsite() {
        return website;
    }

    public UserCompany getCompany() {
        return company;
    }
}

Переменные адрес и company относятся к соответствующим типам классов.

Интерфейс

Нам нужен интерфейс для определения конечной точки, которую мы получаем из API.

Создание интерфейса аналогично созданию класса, но вместо класса выберите интерфейс в раскрывающемся списке в приглашении. Назовите интерфейс JsonPlaceHolder API и добавьте вызов для получения данных.

public interface JsonPlaceHolderAPI {
    @GET("users/1")
    Call getUsers();
}

Обязательно реализуйте Call из Retrofit2 и Get .

GET – это HTTP-метод, используемый для запроса данных из указанного ресурса. "Users/1" – это конечная точка, которую мы используем.

Метод getUsers возвращает вызов объекта, который получает объект Json типа Users из конечной точки.

Вид из Окна

Далее мы собираемся изменить activity_main.xml добавив значение идентификатора в Привет, мир! Текстовое представление




    


Связывая все это воедино

Настроив нашу модель данных (pojos), интерфейс и xml, давайте выполним сетевой вызов и отобразим данные.

public class MainActivity extends AppCompatActivity {
    //The Interface instance
    JsonPlaceHolderAPI placeHolderAPI;

    TextView fTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Instantiate the textView
        fTextView = findViewById(R.id.tv1);

        //Building a Retrofit instance
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())//Use Gson
                .build();

        //Use the retrofit instance to create the method body of JsonPlaceHolderApi Interface
        placeHolderAPI = retrofit.create(JsonPlaceHolderAPI.class);

        getUser();
    }
    public void getUser(){
        //Execute the Network request
        Call call = placeHolderAPI.getUsers();
        //Execute the request in a background thread
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if (!response.isSuccessful()){
                    fTextView.setText("Code: " + response.code());
                    return;
                }
                if (response.body().getName() != null){
                    //Get the values
                    String userContent = "";
                    userContent += "ID: " + response.body().getId() + "\n";
                    userContent += "Name: " + response.body().getName() + "\n";
                    userContent += "UserName: " + response.body().getUserName() + "\n";
                    userContent += "Email: " + response.body().getEmail() + "\n";
                    userContent += "Street: " + response.body().getAddress().getStreet() + "\n";
                    userContent += "Suite: " + response.body().getAddress().getSuite() + "\n";
                    userContent += "City: " + response.body().getAddress().getCity() + "\n";
                    userContent += "ZipCode: " + response.body().getAddress().getZipCode() + "\n";
                    userContent += "Latitude: " + response.body().getAddress().getGeo().getLatitude() + "\n";
                    userContent += "Longitude: " + response.body().getAddress().getGeo().getLongitude() + "\n";
                    userContent += "Phone: " + response.body().getPhone() + "\n";
                    userContent += "website: " + response.body().getWebsite() + "\n";
                    userContent += "Company Name: " + response.body().getCompany().getName() + "\n";
                    userContent += "CS: " + response.body().getCompany().getCatchPhrase() + "\n";
                    userContent += "Company BS: " + response.body().getCompany().getBs() + "\n";

                    fTextView.setText(userContent);
                }
            }
            @Override
            public void onFailure(Call call, Throwable t) {
                fTextView.setText("Failure: " + t);
            }
        });
    }
}

Если есть красные линии, щелкните по ним и нажмите alt + enter, чтобы импортировать соответствующие библиотеки.

Последний кусочек головоломки

Перед запуском приложения нам необходимо добавить разрешение на доступ в Интернет в ваш файл манифеста.

Добавьте это перед <приложение> и как первая строка в манифесте


Запустите приложение на устройстве, подключенном к Интернету.

Полный код для этого приложения можно найти здесь

Оригинал: “https://dev.to/collinsgichuki/parsing-nested-json-objects-in-android-478l”