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 ()))\nRun Code Online (Sandbox Code Playgroud)\n这里我试图解析一个字符串
\nval books = Json.decodeFromString<Books>(stringJson)\nRun 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]\nRun Code Online (Sandbox Code Playgroud)\n我总是收到这个错误
\nkotlinx.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)"}]\nRun Code Online (Sandbox Code Playgroud)\n我将非常高兴并感谢任何帮助
\nEnd*_*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)
| 归档时间: |
|
| 查看次数: |
14332 次 |
| 最近记录: |