Создание модели для JSON, где ключ является значением в Android - PullRequest
3 голосов
/ 23 мая 2019

Я хочу создать модель из JSON, где ключ - это значение. Это является точным описанием проблемы, но в iOS. Я хочу подобное решение в Android. По сути, я хочу иметь декодируемый эквивалент в Android.

Я использую GSON для анализа JSON для моделирования. На данный момент я сравнил ключ JSON (упомянутый в ссылке) со статическими значениями.

JSON :

{  
    "rows" :
    [
        {
            "_id": "5cdc0ede5c3dcb04bdb3a972",
            "emp_code": 187,
            "log_id": 361711,
            "punch_time": "2019-05-07T04:00:33.000Z",
            "pin_type": 1,
            "status": 4,
            "__v": 0
        },
        {
            "_id": "5cdc40de5c3dcb04bdb3a972",
            "emp_code": 111,
            "log_id": 361701,
            "punch_time": "2019-05-07T04:00:35.000Z",
            "pin_type": 101,
            "status": 4,
            "__v": 0
        }
    ],
    "pin_type_text": {
        "1": "In Fingerprint",
        "4": "In Card",
        "101": "Out Fingerprint",
        "104": "Out Card"
    }
}  

Значение pin_type в каждой строке относится к записи в pin_type_text , сопоставленной с ее ключом.

Я использую GSON для создания моделей, а вот класс моделей:

class MyModel {
    var length : Long = 0
    var rows = ArrayList<Rows>()
    var pin_type_text : String = ""
}

class PinTypeText {
    var 1 : String = ""
    var 4 : String = ""
    var 101 : String = ""
    var 104 : String = ""
  }

По сути, ключи, определенные в классе PinTypeText, являются значениями ключа 'pin_type', полученного в модели Rows, как видно из общего ресурса JSON. Таким образом, в этом случае ключи в PinTypeText зависят от значений, определенных в строках. Следовательно, я хочу, чтобы модель 'PinTypeText' создавалась относительно значений 'pin_type' из модели 'Rows'.

Проблема : Предположим, что в будущем значения 'pin_type' - 1, 4, 101, 104 изменятся в бэкэнде, как я могу обработать такой случай, не меняя мою модель , Согласно этой структуре модели, мне нужно менять класс модели каждый раз, когда меняется внутренняя модель

1 Ответ

1 голос
/ 23 мая 2019

вы можете сохранить элемент PinTypeText как JsonElement, а не как пользовательский класс, так что ваша модель ответа будет примерно такой

public class Response{

@SerializedName("rows")
@Expose
private List<Row> rows = null;
@SerializedName("pin_type_text")
@Expose
private JsonElement pinTypeText;

public List<Row> getRows() {
return rows;
}

public void setRows(List<Row> rows) {
this.rows = rows;
}

public JsonElement getPinTypeText() {
return pinTypeText;
}

public void setPinTypeText(JsonElement pinTypeText) {
this.pinTypeText = pinTypeText;
}

}

и когда вы хотите проверить тип, вы можете преобразовать его в JsonObject и получить значение для ключа, Пример

 pinTypeText=  response.getPinTypeText().asJsonObject().get([your pin_type here]).toString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...