Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
талраш
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 33
#1

Ретрофит2 как доставать вложенные массивы - Программирование Android

21.02.2017, 07:52. Просмотров 550. Ответов 3
Метки нет (Все метки)

Здравствуйте. Недавно начал изучать ретрофит, но не до конца понимаю как в нём работать с json.
https://medkey.ru/api/index.php?type=catalog апи. Я не могу понять как доставать вложенные массивы. порыскал в интернете, нашёл примеры, но разобраться как с вложенными массивами так и не смог. С помощью сайта мне создало для моего апи 2 файла.Дальше по примерам попробовал но так и не получилось. Прошу показать на примере моего приложения, как сделать.
Catalog.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
 
import java.util.List;
 
public class Katalog {
 
    @SerializedName("type")
    @Expose
    private String type;
    @SerializedName("events")
    @Expose
    private List<Event> events = null;
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public List<Event> getEvents() {
        return events;
    }
 
    public void setEvents(List<Event> events) {
        this.events = events;
    }
 
}
Event.java
http://www.cyberforum.ru/turbo-pascal/thread655812.html
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
 
public class Event {
 
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("price")
    @Expose
    private String price;
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("description")
    @Expose
    private String description;
    @SerializedName("picture")
    @Expose
    private String picture;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPrice() {
        return price;
    }
 
    public void setPrice(String price) {
        this.price = price;
    }
 
    public String getId() {
        return id;
    }
 
    public void setId(String id) {
        this.id = id;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
 
    public String getPicture() {
        return picture;
    }
 
    public void setPicture(String picture) {
        this.picture = picture;
    }
 
}
App.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import android.app.Application;
 
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import ru.mustakimov.retrofittutorial.api.UmoriliApi;
 
public class App extends Application {
 
    private static UmoriliApi umoriliApi;
    private Retrofit retrofit;
 
    @Override
    public void onCreate() {
        super.onCreate();
 
        retrofit = new Retrofit.Builder()
                .baseUrl("https://medkey.ru/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        umoriliApi = retrofit.create(UmoriliApi.class);
    }
 
    public static UmoriliApi getApi() {
        return umoriliApi;
    }
}
MainActivity.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
 
import java.util.ArrayList;
import java.util.List;
 
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
 
public class MainActivity extends AppCompatActivity {
 
    RecyclerView recyclerView;
    List<PostModel> posts;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        posts = new ArrayList<>();
 
        recyclerView = (RecyclerView) findViewById(R.id.posts_recycle_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
 
        PostsAdapter adapter = new PostsAdapter(posts);
        recyclerView.setAdapter(adapter);
 
        App.getApi().getData("price", "name").enqueue(new Callback<List<Catalog>>() {
            @Override
            public void onResponse(Call<List<PostModel>> call, Response<List<Catalog>> response) {
                posts.addAll(response.body());
                recyclerView.getAdapter().notifyDataSetChanged();
            }
 
            @Override
            public void onFailure(Call<List<Catalogl>> call, Throwable t) {
                Toast.makeText(MainActivity.this, "An error occurred during networking", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
api.java
Java
1
2
3
4
5
6
7
8
9
10
11
import java.util.List;
 
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
 
public interface UmoriliApi {
 
    @GET("/api/index.php?type=catalog")
    Call<List<PostModel>> getData(@Query("price") String resourceName, @Query("name") String resourceName);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2017, 07:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ретрофит2 как доставать вложенные массивы (Программирование Android):

Пожалуйста, объясните, как хранить файлы (картинки) в базе, и как их оттуда доставать
Добрый день. Не могли бы Вы на пальцах объяснить, как класть и доставать...

Как на ASP класть/доставать файлы в MS SQL?
Добрый день. Не могли бы Вы на пальцах объяснить, как класть и доставать...

Как доставать сообщения из Интернета и отправлять через gnokii?
Ув. форумчане, появилась нужда создать смс web-сервис с интерфейсом на...

Вложенные массивы
Ребята помогите закрыть последний предмет в заочке, все сдал кроме ассемблера,...

Вложенные массивы
questiоn = , , , ] ]; как задать такой массив??? напр. мне нужно 18...

3
Александр_Алекс
7 / 4 / 4
Регистрация: 08.12.2013
Сообщений: 165
21.02.2017, 08:51 #2
Вам нужен getter в моедли, который будет возвращать вложенный массив. Геттеров должно быть столько, сколько вложенностей в модели, если я правильно понимаю.

Попробую показать на примере того, как делал у себя я.

Есть json:
Кликните здесь для просмотра всего текста
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "status": "success",
  "values": [
    {
      "id": 16,
      "year": 2017,
      "month": 1,
      "day": 15,
      "times": "19,20",
      "name": "Alexander",
      "telephone": "096666666",
      "comment": "bla-bla-bla",
      "type": 0
    },
    {
      "id": 30,
      "year": 2017,
      "month": 1,
      "day": 15,
      "times": "18,17",
      "name": "asasd",
      "telephone": "00666625",
      "comment": "",
      "type": 1
    },
    {
      "id": 31,
      "year": 2017,
      "month": 1,
      "day": 15,
      "times": "16,15",
      "name": "Aaa",
      "telephone": "0665342",
      "comment": "sdfsdf",
      "type": 0
    }
  ]
}


У меня тут имеется вложенный массив values.

На каком-нибудь json -> pojo сервисе строим модель, я получил примерно такое

Модель ответа:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class BookingModel {
 
    @SerializedName("status")
    @Expose
    private String status;
    @SerializedName("values")
    @Expose
    private List<Value> values = null;
 
    public String getStatus() {
        return status;
    }
 
    public void setStatus(String status) {
        this.status = status;
    }
 
    public List<Value> getValues() {
        return values;
    }
 
    public void setValues(List<Value> values) {
        this.values = values;
    }
}


Тут нужно обратить внимание на геттер
Java
1
2
3
  public List<Value> getValues() {
        return values;
    }
С помощью него я получаю вложенный объект
модель values
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
class Value{
 
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("year")
    @Expose
    private Integer year;
    @SerializedName("month")
    @Expose
    private Integer month;
    @SerializedName("day")
    @Expose
    private Integer day;
    @SerializedName("times")
    @Expose
    private String times;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("telephone")
    @Expose
    private String telephone;
    @SerializedName("comment")
    @Expose
    private String comment;
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public Integer getYear() {
        return year;
    }
 
    public void setYear(Integer year) {
        this.year = year;
    }
 
    public Integer getMonth() {
        return month;
    }
 
    public void setMonth(Integer month) {
        this.month = month;
    }
 
    public Integer getDay() {
        return day;
    }
 
    public void setDay(Integer day) {
        this.day = day;
    }
 
    public String getTime() {
        return times;
    }
 
    public void setTime(String times) {
        this.times = times;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getTelephone() {
        return telephone;
    }
 
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
 
    public String getComment() {
        return comment;
    }
 
    public void setComment(String comment) {
        this.comment = comment;
    }
}


Вот так выглядит апи-интерфейс, я просто получаю один объект
Кликните здесь для просмотра всего текста
Java
1
2
3
4
    @GET("/booking/get")
    Call<BookingModel> getForDay(@Query("year") Integer year, @Query("month") Integer month,
                                @Query("day") Integer day);
}


Потом, где-то в своей async task'e ты получил свой объект, и просто и спользуешь get-метод, о котором я писал выше
Java
1
 List<Value> values = bookingModel.getValues(); //bookingmodel - это сериализованный json объект который мне отдал сервер по запросу
Надеюсь, все понятно. Возможно тут есть какие-то недочеты, но зато работает)
0
талраш
0 / 0 / 0
Регистрация: 26.02.2013
Сообщений: 33
21.02.2017, 09:54  [ТС] #3
Спасибо, сейчас попробую.
0
AlexTsy
0 / 0 / 0
Регистрация: 04.03.2018
Сообщений: 1
04.03.2018, 21:54 #4
Александр_Алекс, подскажите, а в каком случае в строке:
Java
1
List<Value> values = bookingModel.getValues();
Java
1
bookingModel.getValues();
не будет возвращать список, а values останется пустым?

Добавлено через 1 час 45 минут
Потому, что запрос и не возвращал массив
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2018, 21:54
Привет! Вот еще темы с решениями:

массивы и Вложенные циклы
Помогите пожалуйста решить очень нужно!!!! 5 задач нужно через 2 дня сдавать я...

Вложенные циклы + массивы
Помогите пожалуйста сделать задание. Задана матрица целых чисел M x N,...

массивы и Вложенные циклы
Дано натуральное число n. Получить все простые делители этого числа.пацаны...

DBXJSON и вложенные массивы
Всем привет! Подскажите как получить значения во вложенных массивах json. Имею...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru