拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 我如何反序列化这个json?

我如何反序列化这个json?

白鹭 - 2022-01-24 2158 0 0

我正在做一个项目,我需要每天访问一次货币汇率,所以我正在尝试使用这个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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *