这是implementation 'org.json:json:20180813'
所以我有一个 User
类,它允许将自身转换为 json 字符串以实现持久性:
data class User(override val name:String, override val creds:ICredentials) : IUser, isEncodable<IUser>{
override val isLoggedIn by lazy { creds is Credentials.Valid }
override fun encode():String{
val credsEncoding = creds.encode()
return JSONStringer().withObject { it
.key("type").value(this::class.java.name)
.key("name").value(name)
.key("creds").value(credsEncoding)
}.toString()
}
}
其中withObject
是扩展函数:
fun JSONWriter.withObject(content:(JSONWriter)->JSONWriter) = content(`object`() as JSONWriter).endObject()
这似乎编译和工作得很好。
但是,AndroidStudio将其标记为红色并声称
。未解析的引用
由于接收器类型不匹配,以下候选项均不适用
public fun JSONWriter.withObject(content:(JSONWriter)->JSONWriter):JSONWriter! defined in [...]`
如果我试图"作弊"并将其写成
(JSONStringer() as JSONWriter).withObject { it
...
}
错误变为警告
这个演员阵容永远不会成功。
但显然,它确实如此。
为什么?我如何摆脱这个"错误"?
这是通过实现'org.json:json:20180813'
这不太可能奏效。
为什么?
在过去的 11 年里,Android 在 Android SDK 中拥有 org.json
类的副本。这包括JSONStringer
.不能有两个类具有相同的完全限定名称,并且固件始终获胜。不会使用冲突类的副本,而是使用固件副本。在过去的11年里,固件的API没有太大变化。
我如何摆脱这个"错误"?
删除implementation 'org.json:json:20180813'
。也:
- 使用 Android SDK 的内置
org.json
类,或者 - 使用 Android SDK 的
JsonReader
和JsonWriter
类,或者 - 使用不同的 JSON 解析器(例如,Gson、Jackson、Moshi)