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

Posted

技术标签:

【中文标题】为JSON创建模型,其中键是android中的值【英文标题】:Creating model for JSON where key is a value in android 【发布时间】:2019-10-09 23:33:31 【问题描述】:

我想从JSON 创建一个模型,其中键是一个值。 This 是描述的确切问题,但在 ios 中。我想在 android 中使用类似的解决方案。基本上我想在 Android 中有一个可解码的等价物。

我正在使用GSONJSON 解析为模型。到目前为止,我已经将 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中与其key对应的记录。

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

问题 :假设将来,'pin_type' 值 - 1, 4, 101, 104 在后端发生变化,我如何在不改变的情况下处理这种情况我的模型。根据这个模型结构,每次后端模型更改时我都需要更改我的模型类

【问题讨论】:

您可以做两件事:1.) 要求后端团队修复他们的 API 并提供具有非动态模式的 JSON 格式 2.) 手动解析并希望获得最好的结果 【参考方案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()

【讨论】:

以上是关于为JSON创建模型,其中键是android中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中向模型添加临时字段?

Django 模型过滤器以 JSONField 为目标,其中键包含连字符/破折号

如何检查 JSON 对象键是对象还是字符串? [复制]

JSON解析期间的Typescript自动类型转换?

在 spark 中读取单行 json,其中列键是可变的

将 JSON 转换为地图