尝试解析 json 字符串,但得到对象“”的预期开始,但改为“EOF”

Posted

技术标签:

【中文标题】尝试解析 json 字符串,但得到对象“”的预期开始,但改为“EOF”【英文标题】:Trying unparse json string, but getting Expected start of the object '', but had 'EOF' instead尝试解析 json 字符串,但得到对象“”的预期开始,但改为“EOF” 【发布时间】:2022-01-03 04:06:07 【问题描述】:

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

    @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 ()))

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

val books = Json.decodeFromString<Books>(stringJson)

这是我的 Json 字符串

[
  
    "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)"
  
]

我总是收到这个错误

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)"]

如果有任何帮助,我将非常高兴和感激

【问题讨论】:

【参考方案1】:

tl;dr

交换这个

val books = Json.decodeFromString<Books>(stringJson)

有了这个

val books = Json.decodeFromString<List<Book>>(stringJson)

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

您要么必须将 JSON 数组包装在 JSON 对象的属性 books 中,要么在反序列化期间将预期类型更改为 List&lt;Book&gt;

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

val wrappedStringJson = """
    
      "books": $stringJson
    
""".trimIndent()
val books = Json.decodeFromString<Books>(wrappedStringJson)

【讨论】:

...我不知道我怎么会错过它,非常感谢。现在它的工作)

以上是关于尝试解析 json 字符串,但得到对象“”的预期开始,但改为“EOF”的主要内容,如果未能解决你的问题,请参考以下文章

使用Jackson“意外令牌(START_OBJECT)使用LocalDateTime将JSON解析为POJO,预期VALUE_STRING:预期的数组或字符串。”

解析 JSON 错误“预期解码 Array<Any> 但找到了一个数字

Vue战争:预期数组,得到对象

在 Robot 框架中解析 JSON 输出 [TypeError:预期的字符串或缓冲区]

yaml 解析时出错。预期 <block end>,但找到 <scalar>

React 备忘录功能给出:- 未捕获的错误:元素类型无效:预期为字符串但得到:对象