2017-01-26 2 views
0

Я использую библиотеку Retrofit для запроса вызова и Gson Converter для преобразования в объект класса. Но ответ API JSON не «ясен», и мне нужно вручную исправить некоторые поля (например, конвертировать html в читаемый текст). Но сеттеры не вызываются при конвертации.Сетчаты, не вызываемые во время преобразования json в объект класса (с использованием Retrofit и Gson Converter)

Возможно ли при создании значений полей объекта установить только через его сеттеры?

ответ

0

Вам не нужно устанавливать сеттеры/конструкторы, вы должны использовать только аннотации.

Например, если ваш ответ сервера выглядит следующим образом:

{ 
    "count": 12, 
    "devices": [{ 
     "adb_url": null, 
     "owner": null, 
     "ready": true, 
     "serial": "XXXXXX", 
     "model": "GT-N7100", 
     "present": true 
    }, { 
     "adb_url": null, 
     "owner": null, 
     "ready": true, 
     "serial": "XXXXXX", 
     "model": "GT-I9500", 
     "present": true 
    }] 
} 

Вы должны создать класс устройств и класс устройств распределялись следующим образом: Класс

устройств:

import com.google.gson.annotations.SerializedName; 

public class Device { 

    @SerializedName("adb_url") 
    String adbUrl; 
    @SerializedName("owner") 
    String owner; 
    @SerializedName("ready") 
    Boolean isReady; 
    @SerializedName("serial") 
    String serial; 
    @SerializedName("model") 
    String model; 
    @SerializedName("present") 
    Boolean present; 

    public Device(String adbUrl, String owner, Boolean isReady, String serial, String model, Boolean present) { 
     this.adbUrl = adbUrl; 
     this.owner = owner; 
     this.isReady = isReady; 
     this.serial = serial; 
     this.model = model; 
     this.present = present; 
    } 

} 

Устройства Тип ответа:

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.SerializedName; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by avilevinshtein on 01/01/2017. 
*/ 
public class DeviceResponse { 
    @SerializedName("count") 
    int deviceSize; 

    @SerializedName("devices") 
    List<Device> deviceList; 

    public DeviceResponse() { 
     deviceSize = 0; 
     deviceList = new ArrayList<Device>(); 
    } 

    public DeviceResponse(List<Device> deviceList) { 
     this.deviceList = deviceList; 
     deviceSize = deviceList.size(); 
    } 

    public DeviceResponse(int deviceSize, List<Device> deviceList) { 
     this.deviceSize = deviceSize; 
     this.deviceList = deviceList; 
    } 

    public static DeviceResponse parseJSON(String response) { 
     Gson gson = new GsonBuilder().create(); 
     DeviceResponse deviceResponse = gson.fromJson(response, DeviceResponse.class); 
     return deviceResponse; 
    } 
} 

P.S - Я использовал только контрагентов для удобства.

Если вам нужно создать сообщение POST, вы также должны создать DeviceRequest, который отражает структуру JSON, переданную в теле запроса.

Обратите внимание, что имя внутри @SerializedName («имя json-поля») должно быть реальным ключом JSON.

+0

Спасибо за ответ, но если мне нужно изменить некоторые поля, как мне это сделать? В моем случае я получаю не совсем «четкие» данные (некоторые поля содержат html вместо обычного текста), и мне нужно их исправить. Конечно, я могу исправить их в getter, но я хотел бы исправить их непосредственно в самом объекте (в момент создания объекта). – Mikhail

+0

@ Майкл, можете ли вы поделиться образцом ответа? Является ли ваш ответ форматом JSON? –

+0

@Mikhail, Gson может работать с сеттерами только с v2.3 (https://github.com/google/gson/issues/232). В настоящее время Модернизация работает с пользовательской версией 2.1. https://search.maven.org/#search%7Cga%7C1%7Ccom.squareup.retrofit2 Если вы хотите работать с сеттерами, вам придется использовать джексон или другой конвертер. Я лично работал в прошлом с Джексоном, и это сработало. –

Смежные вопросы