我正在做一个项目,我需要每天访问一次货币汇率,所以我正在尝试使用这个json。
要阅读本文,我只是获取 URL 的文本,然后尝试使用 JSONReader 进行反序列化。
val url = URL("https://www.floatrates.com/daily/usd.json")
val stream = url.openStream()
url.readText()
val jsonReader = JsonReader(InputStreamReader(stream))
jsonReader.isLenient = true
jsonReader.beginObject()
while (jsonReader.hasNext()) {
val codeName:String = jsonReader.nextName()
jsonReader.beginObject();
var code:String? = null
var rate = 0.0
while (jsonReader.hasNext()) {
val name:String = jsonReader.nextName()
when(name){
"code" -> {
code = jsonReader.nextString()
break
}
"rate" -> {
rate = jsonReader.nextDouble()
break
}
else -> {
jsonReader.skipValue()
}
}
code?.let {
rates?.set(it, rate)
}
}
}
jsonReader.endObject();
当我运行代码时,我得到:
Expected BEGIN_OBJECT but was STRING
在
jsonReader.beginObject();
当我尝试使用 Gson 时,使用以下代码:
var url = URL("https://www.floatrates.com/daily/usd.json").readText()
//url = "[${url.substring(1, url.length - 1)}]"
val gson = Gson()
val currencies:Array<SpesaCurrency> = gson.fromJson(url, Array<SpesaCurrency>::class.java)
我收到此错误:
Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $[0]
在:
gson.fromJson(url, Array<SpesaCurrency>::class.java)
SpesaCurrency.kt 看起来像这样:
class SpesaCurrency(
val code:String,
val alphaCode:String,
val numericCode:String,
val name:String,
val rate:Float,
val date:String,
val inverseRate:Float
)
任何帮助是极大的赞赏。
uj5u.com热心网友回复:
我认为有一个
jsonReader.endObject();
在您的代码中丢失。这种不平衡导致程序在读取第一个物件后失败。在内部之后添加它
while (jsonReader.hasNext()) {
...
}
环形。
0 评论