使用Gson Kotlin解析嵌套的Josn

时间:2020-07-19 20:14:10

标签: android json kotlin gson

尝试将以下json转换为列表数据对象:

[
  {
    "type": "PHOTO",
    "id": "pic1",
    "title": "Photo 1",
    "dataMap": {}
  },
  {
    "type": "SINGLE_CHOICE",
    "id": "choice1",
    "title": "Photo 1 choice",
    "dataMap": {
      "options": [
        "Good",
        "OK",
        "Bad"
      ]
    }
  },
    ---
    ---
]

代码:

data class User(val type: String, val id: String, val title: String, val options: List<Options>)

data class Options(val dataMap: String)

fun getUserListFromAssert(context: Context, fileName: String) : List<User>{
    val gson = Gson()
    val listPersonType = object : TypeToken<List<User>>() {}.type

    var users: List<User> = gson.fromJson(getJsonDataFromAsset(context, fileName), listPersonType)

    return users;
}

现在调用getUserListFromAssert:

var users: List<User>  = TemporaryData.getUserListFromAssert(this, "users.json")

    users.forEach { s -> Log.d(TAG, "onCreate: $s") }

输出:

User(type=PHOTO, id=pic1, title=Photo 1, options=null)
---

我无法从json获取选项列表。

我尝试了以下代码,并且能够在dataMap内检索选项。 是否可以直接在用户类中检索选项列表?

data class User(val type: String, val id: String, val title: String, @SerializedName("dataMap") val options: dataMap)
data class dataMap(val options: List<String>)

输出:

User(type=PHOTO, id=pic1, title=Photo 1, options=dataMap(options=null))
User(type=SINGLE_CHOICE, id=choice1, title=Photo 1 choice, options=dataMap(options=[Good, OK, Bad]))

3 个答案:

答案 0 :(得分:1)

默认情况下,您的variable name将引用您的JSON key。因此,您可以尝试以下方法:

data class User(val type: String, val id: String, val title: String, val dataMap: List<Options>)

但是,如果您仍然想要options作为变量名。您可以使用@SerializedName

data class User(val type: String, val id: String, val title: String, @SerializedName("dataMap") val options: List<Options>)

答案 1 :(得分:0)

选项应为字符串列表。

data class Options(val dataMap: List<String>)

答案 2 :(得分:0)

您可以尝试

val jsonObject = JSONObject(<your JSON string result>);
val jsonArray = jsonObject.getJSONArray();

//use GSON to parse
if (jsonArray != null) {
   val gson = Gson();
   val objResponse = gson.fromJson(jsonArray.toString(), ObjResponse[]::class.java);
   val objResponseList = Arrays.asList(objResponse);
}