首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试解解析json字符串,但得到了对象“{”的预期开始,但是使用了“EOF”

尝试解解析json字符串,但得到了对象“{”的预期开始,但是使用了“EOF”
EN

Stack Overflow用户
提问于 2021-11-24 19:05:34
回答 2查看 5K关注 0票数 3

我正在尝试使用kotlin序列化将一个json文件解析为一个列表。这是我的数据类。

代码语言:javascript
复制
    @Serializable
data class Book(
    val epub : String,
    val fb2 : String,
    val mobi : String,
    val djvu : String,
    val title : String,
    val author : String,
    val anotation: String,
    val cover_uri : String,
)

@Serializable
data class Books(
    @Serializable (with = BookListSerializer::class)
    val books : List<Book>
)

object  BookListSerializer  :  JsonTransformingSerializer < List < Book >> ( ListSerializer ( Book.serializer ()))

在这里,我试图解析一个字符串

代码语言:javascript
复制
val books = Json.decodeFromString<Books>(stringJson)

在这里我的Json字符串

代码语言:javascript
复制
[
  {
    "anotation": "Этот город",
    "author": "Чарльз Плэтт",
    "cover_uri": "null",
    "djvu": "null",
    "epub": "/b/301494/epub",
    "fb2": "/b/301494/fb2",
    "mobi": "/b/301494/mobi",
    "title": "New York Times (Пульс Нью-Йорка) (fb2)"
  },
  {
    "anotation": "Способна л",
    "author": "Триш Уайли",
    "cover_uri": "/i/45/390445/cover.jpg",
    "djvu": "null",
    "epub": "/b/390445/epub",
    "fb2": "/b/390445/fb2",
    "mobi": "/b/390445/mobi",
    "title": "Лучший мужчина Нью-Йорка (fb2)"
  }
]

我总是会犯这样的错误

代码语言:javascript
复制
kotlinx.serialization.json.internal.JsonDecodingException: Expected start of the object '{', but had 'EOF' instead
    JSON input: .....2","mobi":"/b/49442/mobi","title":"I love New York (fb2)"}]

我将非常高兴和感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-24 19:34:47

tl;博士

交换这个

代码语言:javascript
复制
val books = Json.decodeFromString<Books>(stringJson)

有了这个

代码语言:javascript
复制
val books = Json.decodeFromString<List<Book>>(stringJson)

您正在尝试反序列化一个JSON数组[ ... ],但是在调用decodeFromString时将一个类型为Books的对象声明为目标,因此类似于{ books: [ ... ] }

您必须将JSON数组包装在JSON对象的属性books中,或者在反序列化期间将预期的类型更改为List<Book>

因此,除了上述解决方案之外,还可以执行以下操作:

代码语言:javascript
复制
val wrappedStringJson = """
    {
      "books": $stringJson
    }
""".trimIndent()
val books = Json.decodeFromString<Books>(wrappedStringJson)
票数 8
EN

Stack Overflow用户

发布于 2022-08-18 09:25:16

在Ktor服务器上进行测试时,我也遇到了同样的问题。

代码语言:javascript
复制
fun testFun() = testApplication { ....
val response = client.get("/boruto/heroes")
val actual = Json.decodeFromString<ApiResponse>(response.content.toString())
....
}

问题是,我使用的是content,而不是body

val actual = Json.decodeFromString<T>(response.content.toString())

我把它改为这个,测试通过了。

val actual = Json.decodeFromString<T>(response.body())

把这个留在这里以防有人遇到同样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70101639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档