尝试解解析 json 字符串,但得到 Expected start of the object '{', but had 'EOF' 相反

Nik*_*nov 8 serialization parsing json kotlin

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

\n
    @Serializable\ndata class Book(\n    val epub : String,\n    val fb2 : String,\n    val mobi : String,\n    val djvu : String,\n    val title : String,\n    val author : String,\n    val anotation: String,\n    val cover_uri : String,\n)\n\n@Serializable\ndata class Books(\n    @Serializable (with = BookListSerializer::class)\n    val books : List<Book>\n)\n\nobject  BookListSerializer  :  JsonTransformingSerializer < List < Book >> ( ListSerializer ( Book.serializer ()))\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
val books = Json.decodeFromString<Books>(stringJson)\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 Json 字符串

\n
[\n  {\n    "anotation": "\xd0\xad\xd1\x82\xd0\xbe\xd1\x82 \xd0\xb3\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb4",\n    "author": "\xd0\xa7\xd0\xb0\xd1\x80\xd0\xbb\xd1\x8c\xd0\xb7 \xd0\x9f\xd0\xbb\xd1\x8d\xd1\x82\xd1\x82",\n    "cover_uri": "null",\n    "djvu": "null",\n    "epub": "/b/301494/epub",\n    "fb2": "/b/301494/fb2",\n    "mobi": "/b/301494/mobi",\n    "title": "New York Times (\xd0\x9f\xd1\x83\xd0\xbb\xd1\x8c\xd1\x81 \xd0\x9d\xd1\x8c\xd1\x8e-\xd0\x99\xd0\xbe\xd1\x80\xd0\xba\xd0\xb0) (fb2)"\n  },\n  {\n    "anotation": "\xd0\xa1\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbe\xd0\xb1\xd0\xbd\xd0\xb0 \xd0\xbb",\n    "author": "\xd0\xa2\xd1\x80\xd0\xb8\xd1\x88 \xd0\xa3\xd0\xb0\xd0\xb9\xd0\xbb\xd0\xb8",\n    "cover_uri": "/i/45/390445/cover.jpg",\n    "djvu": "null",\n    "epub": "/b/390445/epub",\n    "fb2": "/b/390445/fb2",\n    "mobi": "/b/390445/mobi",\n    "title": "\xd0\x9b\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 \xd0\xbc\xd1\x83\xd0\xb6\xd1\x87\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x9d\xd1\x8c\xd1\x8e-\xd0\x99\xd0\xbe\xd1\x80\xd0\xba\xd0\xb0 (fb2)"\n  }\n]\n
Run Code Online (Sandbox Code Playgroud)\n

我总是收到这个错误

\n
kotlinx.serialization.json.internal.JsonDecodingException: Expected start of the object '{', but had 'EOF' instead\n    JSON input: .....2","mobi":"/b/49442/mobi","title":"I love New York (fb2)"}]\n
Run Code Online (Sandbox Code Playgroud)\n

我将非常高兴并感谢任何帮助

\n

End*_*eit 12

太长了;博士

交换这个

val books = Json.decodeFromString<Books>(stringJson)
Run Code Online (Sandbox Code Playgroud)

有了这个

val books = Json.decodeFromString<List<Book>>(stringJson)
Run Code Online (Sandbox Code Playgroud)

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

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

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

val wrappedStringJson = """
    {
      "books": $stringJson
    }
""".trimIndent()
val books = Json.decodeFromString<Books>(wrappedStringJson)
Run Code Online (Sandbox Code Playgroud)