如何使用kotlinx.serialization部分解析JSON字符串?

10

我有一个看起来像这样的JSON字符串:{"code": "FOO"}.

现在我想使用kotlinx.serialization对此字符串进行反序列化。我尝试了以下方法:

import kotlinx.serialization.*

@Serializable
data class Result(val code: String?)

val decoded = Json.decodeFromString<Result>(jsonString)

当JSON只包含 code 时,这个方法是有效的。但实际上JSON字符串中可能存在其他键(我无法控制)。我只关心 code 键,但当存在其他键时,我的应用程序会崩溃。

我该如何仅解码相关的JSON键?

2个回答

30

在进一步调试我的应用程序后,我发现以下错误:

JsonDecodingException:偏移量为14的意外JSON令牌:遇到未知键“error”。 在“Json {}”构建器中使用“ignoreUnknownKeys = true”以忽略未知键。 JSON输入:{"code":"FOO","otherKey":"Something else"}

我没有找到任何关于这个问题的文档,但我通过将我的代码更改为以下内容来解决了它:

import kotlinx.serialization.*

@Serializable
data class Result(val code: String?)

val decoded = Json { ignoreUnknownKeys = true }.decodeFromString<ErrorResponse>(jsonString)

1
文档在这里 https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/json.md#ignoring-unknown-keys - vovahost

1
我们可以使用关键字ignoreUnknownKeys部分解码具有必需键的JSON。
fun create(): NetworkService {
        return NetworkServiceImpl(
            client = HttpClient(Android) {
                install(Logging) {
                    level = LogLevel.ALL
                }
                install(JsonFeature) {
                    serializer = KotlinxSerializer(
                        json = kotlinx.serialization.json.Json {
                            isLenient = true
                            ignoreUnknownKeys = true
                        })
                }
            }
        )
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接