【问题标题】:parsing json object with number as its key fields?解析以数字为关键字段的json对象?
【发布时间】:2020-04-19 09:37:19
【问题描述】:

我正在尝试将 json 解析为 kotlin 对象,但问题是它的关键字段是数字,不知道如何解析它们,我尝试了序列化名称但仍然面临问题。

json 响应如下所示:

{
    "Id": [{
            "1": {
                "name": "name1",
                "class": "11a"
            }
        },
        {
            "2": {
                "name": "name2",
                "class": "11b"
            }
        }
    ]
}

我正在使用 gson,我想要做的主要事情是将这个数字字段存储为其他一些字符串对象。

【问题讨论】:

  • 您发布的内容不是有效的 JSON。将其更改为 Valid JSON,同时仍保持您的问题不变,因为它仍然是一个有效问题。

标签: json kotlin gson


【解决方案1】:

您可以将它们解析为映射列表,然后将它们“映射”到您的数据类:

    val input = """{
    "Id": [{
            "1": {
                "name": "name1",
                "class": "11a"
            }
        },
        {
            "2": {
                "name": "name2",
                "class": "11b"
            }
        }
    ]
}"""

    val gson = Gson()
    val parsed: Map<String, List<Map<String, Any>>> = 
        gson.fromJson(input, (object : TypeToken<Map<String, List<Map<String, Any>>>>(){}).type)
    println(parsed["Id"]?.get(0)?.get("1")) // {name=name1, class=11a}

不过,它会有一些讨厌的通用签名。

如果您正在使用 Kotlin,请查看 Klaxon,它将改善您的体验。

【讨论】:

  • 您提供的 JSON 中没有 countryitems,因此我的示例可能无法在您的代码中按原样运行。您是否在解析或获取值时遇到错误?
  • val parsed: Map&lt;String, List&lt;Map&lt;String, Any&gt;&gt;&gt; = gson.fromJson(body, (object : TypeToken&lt;Map&lt;String, List&lt;Map&lt;String, Any&gt;&gt;&gt;&gt;(){}).type) val parsedvalue: Map&lt;Any, Any&gt; = parsed["id"]?.get(0)?.get("1) as Map&lt;Any, Any&gt;
  • 感谢这解决了我的问题,我通过将数据存储到另一个变量中来进一步映射数据。本例中为 val parsedvalue。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2011-06-09
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多