【问题标题】:How to convert JSON data into Kotlin object如何将 JSON 数据转换为 Kotlin 对象
【发布时间】:2019-10-08 07:51:49
【问题描述】:

我这里有一个现有 json 的示例,
我的问题是我需要将其转换为 kotlin,
我是 kotlin 的新手,已经阅读了很多教程,但是
我从来没有像这样复杂的样本。

这是 JSON

{
"mobile": {
    "id":"1",
    "Device": {
        "Device Name": "Huawei P30 Pro",
        "Price": "10000",
        "rating": "3.4",
        "phone_img_url": "https://fdn2.gsmarena.com/vv/bigpic/huawei-mate30-pro-.jpg", 
        "Category": "Phablet",
        "Description": {
            "Network": ["GSM", "HSPA", "LTE"],
            "Launch": {
                "Announced Date": "2019, September",
                "Status": "Available. Released 2019, September"
            },
            "Body": {
                "Dimension": "158.1 x 73.1 x 8.8 mm (6.22 x 2.88 x 0.35 in)",
                "Weight": "198 g (6.98 oz)",
                "Build": "Front/back glass (Gorilla Glass 6), aluminum frame",
                "Network": [
                    "Single SIM (Nano-SIM) or Hybrid Dual SIM (Nano-SIM, dual stand-by)", 
                    "IP68 dust/water resistant (up to 1.5m for 30 mins)"],
                "Display":{
                    "Type": "OLED capacitive touchscreen, 16M colors",
                    "Size": "6.53 inches, 108.7 cm2 (~94.1% screen-to-body ratio)",
                    "Resolution": "1176 x 2400 pixels, 18.5:9 ratio (~409 ppi density)",
                    "Protection": ["Corning Gorilla Glass 6",
                        "DCI-P3",
                        "HDR10"
                    ]
                }
            }
        }
    },
    "id":"2",
    "Device": {
        "Device Name": "Xiaomi Redmi Note 8 Pro",
        "Price": "15000",
        "rating": "3.4",
        "Category": "Phablet",
        "Description": {
            "Network": ["GSM", "HSPA", "LTE"],
            "Launch": {
                "Announced Date": "2019, August",
                "Status": "Available. Released 2019, September"
            },
            "Body": {
                "Dimension": "161.4 x 76.4 x 8.8 mm (6.35 x 3.01 x 0.35 in)",
                "Weight": "200 g (7.05 oz)",
                "Build": "Front/back glass (Gorilla Glass 5)",
                "Network": [
                    "Hybrid Dual SIM (Nano-SIM, dual stand-by)"],
                "Display":{
                    "Type": "IPS LCD capacitive touchscreen, 16M colors",
                    "Size": "6.53 inches, 104.7 cm2 (~84.9% screen-to-body ratio)",
                    "Resolution": "1080 x 2340 pixels, 19.5:9 ratio (~395 ppi density)",
                    "Protection": ["Corning Gorilla Glass 6",
                        "500 nits max brightness",
                        "HDR"
                    ]
                }
            }
        }
    },
    "id":"3",
    "Device": {
        "Device Name": "Huawei P30 Pro",
        "Price": "17000",
        "rating": "3.4",
        "Category": "Phablet",
        "Description": {
            "Network": ["GSM", "HSPA", "LTE"],
            "Launch": {
                "Announced Date": "2019, March",
                "Status": "Available. Released 2019, March"
            },
            "Body": {
                "Dimension": "158 x 73.4 x 8.4 mm (6.22 x 2.89 x 0.33 in)",
                "Weight": "192 g (6.77 oz)",
                "Build": "Front/back glass, aluminum frame",
                "Network": [
                    "Single SIM (Nano-SIM) or Hybrid Dual SIM (Nano-SIM, dual stand-by)", 
                    "IP68 dust/water resistant (up to 2m for 30 mins)"],
                "Display":{
                    "Type": "OLED capacitive touchscreen, 16M colors",
                    "Size": "6.47 inches, 102.8 cm2 (~88.6% screen-to-body ratio)",
                    "Resolution": "1080 x 2340 pixels, 19.5:9 ratio (~398 ppi density)",
                    "Protection": ["DCI-P3",
                        "HDR10"
                    ]
                }
            }
        }
    }           
}

}

目前我确实有一个简单的代码,但它没有返回我的“手机”的完整列表
这是我的示例对象

class Phone (
val mobile: PhoneList
)

data class PhoneList (
    val id: String,
    val device: DeviceInfo?
)

data class DeviceInfo (
    val device_name: String
)

提前感谢您的帮助。

【问题讨论】:

标签: json kotlin gson


【解决方案1】:
  1. 浏览网站https://app.quicktype.io/
  2. 将您的 JSON 数据粘贴到左列。
  3. 选择源类型 -> JSON
  4. 选择序列化框架 -> 只是类型
  5. 选择您想要的语言 (Kotlin)

您将获得模型类类型。

class Phone (
    val mobile: List<Mobile>
)

data class Mobile (
    val id: String,
    val device: Device
)

data class Device (
    val deviceName: String,
    val price: String,
    val rating: String,
    val category: String,
    val description: Description
)

data class Description (
    val network: List<String>,
    val launch: Launch,
    val body: Body
)

data class Body (
    val dimension: String,
    val weight: String,
    val build: String,
    val network: List<String>,
    val display: Display
)

data class Display (
    val type: String,
    val size: String,
    val resolution: String,
    val protection: List<String>
)

data class Launch (
    val announcedDate: String,
    val status: String
)

【讨论】:

  • 很好,虽然我用的是Gson,所以总是得到空值
  • 好的。我只是想分享这个方法。它可以用于您想要的任何语言。不仅仅是安卓。
【解决方案2】:
  1. 安装这个插件:https://plugins.jetbrains.com/plugin/9960-json-to-kotlin-class-jsontokotlinclass-
  2. 重启 Android 工作室
  3. 右键单击您想要模型类的文件夹并选择New > Kotlin data class File from JSON
  4. 粘贴 JSON 内容并点击确定
  5. 将 JSON 映射到模型类后,您可以使用 map 获取设备列表。 它将自动生成模型类(基本节省时间)。

【讨论】:

  • 嗨,已经安装并尝试过了。但问题是,它只返回一个设备。 val mobileList = gson?.fromJson(json, PhoneList::class.java)
  • @MaChee Neraid,看看 pt。 5(注意[].class)
  • val mcArray = gson.fromJson(json, Array::class.java) ,但结果是“由:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 2 列路径 $" 处为 BEGIN_OBJECT
  • 是的,因为您的 JSON 不是 List 类型(它是 Object),您需要从 JSON 解析到对象,然后才能将设备映射出来。
猜你喜欢
  • 2021-07-03
  • 2019-12-15
  • 1970-01-01
  • 2011-03-17
  • 2011-05-20
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多