为JSON创建模型,其中key是android中的值

时间:2019-05-23 11:40:12

标签: java android json kotlin gson

我想从JSON创建一个模型,其中键是一个值。 This是描述的确切问题,但在iOS中。我想要Android中的类似解决方案。基本上,我想在Android中拥有与Decodable相当的产品。

我正在使用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中定义的键是在Rows模型中获得的键“ pin_type”的值,如JSON共享所示。因此,在这种情况下,“ PinTypeText”中的键取决于“行”中定义的值。因此,我希望针对“ Rows”模型中的“ pin_type”值创建“ PinTypeText”模型。

问题:假设将来,后端的“ pin_type”值- 1、4、101、104 发生了变化,我该如何处理这种情况而不进行更改我的模特。按照这种模型结构,每次后端模型更改时,我都需要更改模型类

1 个答案:

答案 0 :(得分:1)

您可以将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()