Kotlin 反序列化任何不支持的类型
Kotlin Deserialize Any Type Not Supported
我正在尝试使用 kotlin.serialization 将 JSON 反序列化为 kotlin class。但是,当代码反序列化 json 时,它会抛出错误 kotlinx.serialization.SerializationException: Any type is not supported
谁能帮我解决这个问题?
产品:
@Serializable
data class Product(
val id: Int = 0,
val name: String = "",
val slug: String = "",
val permalink: String = "",
@SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val type: String = "",
val status: String = "",
val featured: Boolean = false,
@SerialName("catalog_visibility") val catalogVisibility: String = "",
val description: String = "",
@SerialName("short_description") val shortDescription: String = "",
val sku: String = "",
val price: String = "",
@SerialName("regular_price") val regularPrice: String = "",
@SerialName("sale_price") val salePrice: String = "",
@SerialName("on_sale") val onSale: Boolean = false,
val purchasable: Boolean = false,
@SerialName("total_sales") val totalSales: Int = 0,
@SerialName("external_url") val externalUrl: String = "",
@SerialName("tax_status") val taxStatus: String = "",
@SerialName("tax_class") val taxClass: String = "",
@SerialName("stock_quantity") val stockQuantity: String = "",
@SerialName("stock_status") val stockStatus: String = "",
val backorders: String = "",
@SerialName("backorders_allowed") val backordersAllowed: Boolean = false,
val backordered: Boolean = false,
@SerialName("sold_individually") val soldIndividually: Boolean = false,
val weight: String = "",
val dimensions: ProductDimensions = ProductDimensions(),
@SerialName("shipping_required") val shippingRequired: Boolean = false,
@SerialName("shipping_taxable") val shippingTaxable: Boolean = false,
@SerialName("shipping_class") val shippingClass: String = "",
@SerialName("shipping_class_id") val shippingClassId: Int = 0,
@SerialName("reviews_allowed") val reviewsAllowed: Boolean = false,
@SerialName("average_rating") val averageRating: String = "",
@SerialName("rating_count") val ratingCount: Int = 0,
@SerialName("related_ids") val relatedIds: List<Int> = listOf(),
@SerialName("upsell_ids") val upsellIds: List<Int> = listOf(),
@SerialName("cross_sell_ids") val crossSellIds: List<Int> = listOf(),
@SerialName("parent_id") val parentId: Int = 0,
@SerialName("purchase_note") val purchaseNote: String = "",
val categories: List<ProductCategory> = listOf(),
val images: List<ProductImage> = listOf(),
val attributes: List<ProductAttribute> = listOf(),
val variations: List<Int> = listOf()
)
产品维度:
data class ProductDimensions(
val length: String = "",
val width: String = "",
val height: String = ""
)
产品属性:
data class ProductAttribute(
val id: Int = 0,
val name: String = "",
val position: Int = 0,
val visible: Boolean = false,
val variation: Boolean = false,
val options: List<String> = listOf()
)
产品类别:
data class ProductCategory(
val id: Int = 0,
val name: String = "",
val slug: String = ""
)
产品图片:
data class ProductImage(
val id: Int = 0,
@SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val src: String = "",
val name: String = "",
val alt: String = ""
)
关联的 json 在 pastebin 上 here
我刚刚试过了,无法重现您的问题。您能否提供一个 github 回购协议,我们可以在其中看到问题?
您的 pastebin link 中的 JSON 存在一个问题,即缺少 stock_status
值,所以我遇到了这个错误:kotlinx.serialization.MissingFieldException: Field stock_status is required, but it was missing
然而,一旦我将该值添加到 JSON 中,我就可以很好地反序列化它。
这是我使用的代码:
import kotlinx.serialization.*
import kotlinx.serialization.json.JSON
import java.io.File
val product = JSON(strictMode = false).parseList<Product>(File("./serializationTest.json").readText())
另一件事是根据documentation
Using Kotlin Serialization requires Kotlin compiler 1.3.0 or higher.
Kotlin 1.3 最近才正式发布,所以您可能正在使用候选版本或其他东西,而不是正式版本(它对我有用)?也许将所有依赖项更新到最新版本并重试?
这是一个有效的 cloud9(简单地 运行 ./gradlew run
)解决方案,使用最新版本的 Kotlin (1.3.0) 和序列化 运行time (0.9 .0)
val serializer = Product.serializer().list
val json = JSON.nonstrict.parse<List<Product>>(serializer, jsonString)
请注意,某些属性必须添加 @Optional 注释才能使此序列化与您的示例一起使用,因此是非严格版本的解析。
@Serializable
data class Product(
val id: Int = 0,
val name: String = "",
val slug: String = "",
val permalink: String = "",
@Optional @SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val type: String = "",
val status: String = "",
val featured: Boolean = false,
@SerialName("catalog_visibility") val catalogVisibility: String = "",
val description: String = "",
@SerialName("short_description") val shortDescription: String = "",
val sku: String = "",
val price: String = "",
@SerialName("regular_price") val regularPrice: String = "",
@SerialName("sale_price") val salePrice: String = "",
@SerialName("on_sale") val onSale: Boolean = false,
val purchasable: Boolean = false,
@SerialName("total_sales") val totalSales: Int = 0,
@SerialName("external_url") val externalUrl: String = "",
@SerialName("tax_status") val taxStatus: String = "",
@SerialName("tax_class") val taxClass: String = "",
@SerialName("stock_quantity") val stockQuantity: String = "",
@Optional @SerialName("stock_status") val stockStatus: String = "",
val backorders: String = "",
@SerialName("backorders_allowed") val backordersAllowed: Boolean = false,
val backordered: Boolean = false,
@SerialName("sold_individually") val soldIndividually: Boolean = false,
val weight: String = "",
val dimensions: ProductDimensions = ProductDimensions(),
@SerialName("shipping_required") val shippingRequired: Boolean = false,
@SerialName("shipping_taxable") val shippingTaxable: Boolean = false,
@SerialName("shipping_class") val shippingClass: String = "",
@SerialName("shipping_class_id") val shippingClassId: Int = 0,
@SerialName("reviews_allowed") val reviewsAllowed: Boolean = false,
@SerialName("average_rating") val averageRating: String = "",
@SerialName("rating_count") val ratingCount: Int = 0,
@SerialName("related_ids") val relatedIds: List<Int> = listOf(),
@SerialName("upsell_ids") val upsellIds: List<Int> = listOf(),
@SerialName("cross_sell_ids") val crossSellIds: List<Int> = listOf(),
@SerialName("parent_id") val parentId: Int = 0,
@SerialName("purchase_note") val purchaseNote: String = "",
val categories: List<ProductCategory> = listOf(),
val images: List<ProductImage> = listOf(),
val attributes: List<ProductAttribute> = listOf(),
val variations: List<Int> = listOf()
)
通知:date_created
、stock_status
根据您的 json 原始数据生成数据 class 的一个很好的在线工具是 quicktype.io
编辑:刚发现cloud9两年前被amazon收购了,不能再创建账户查看public workspace。
所以这里是 link to the filesystem
我正在尝试使用 kotlin.serialization 将 JSON 反序列化为 kotlin class。但是,当代码反序列化 json 时,它会抛出错误 kotlinx.serialization.SerializationException: Any type is not supported
谁能帮我解决这个问题?
产品:
@Serializable
data class Product(
val id: Int = 0,
val name: String = "",
val slug: String = "",
val permalink: String = "",
@SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val type: String = "",
val status: String = "",
val featured: Boolean = false,
@SerialName("catalog_visibility") val catalogVisibility: String = "",
val description: String = "",
@SerialName("short_description") val shortDescription: String = "",
val sku: String = "",
val price: String = "",
@SerialName("regular_price") val regularPrice: String = "",
@SerialName("sale_price") val salePrice: String = "",
@SerialName("on_sale") val onSale: Boolean = false,
val purchasable: Boolean = false,
@SerialName("total_sales") val totalSales: Int = 0,
@SerialName("external_url") val externalUrl: String = "",
@SerialName("tax_status") val taxStatus: String = "",
@SerialName("tax_class") val taxClass: String = "",
@SerialName("stock_quantity") val stockQuantity: String = "",
@SerialName("stock_status") val stockStatus: String = "",
val backorders: String = "",
@SerialName("backorders_allowed") val backordersAllowed: Boolean = false,
val backordered: Boolean = false,
@SerialName("sold_individually") val soldIndividually: Boolean = false,
val weight: String = "",
val dimensions: ProductDimensions = ProductDimensions(),
@SerialName("shipping_required") val shippingRequired: Boolean = false,
@SerialName("shipping_taxable") val shippingTaxable: Boolean = false,
@SerialName("shipping_class") val shippingClass: String = "",
@SerialName("shipping_class_id") val shippingClassId: Int = 0,
@SerialName("reviews_allowed") val reviewsAllowed: Boolean = false,
@SerialName("average_rating") val averageRating: String = "",
@SerialName("rating_count") val ratingCount: Int = 0,
@SerialName("related_ids") val relatedIds: List<Int> = listOf(),
@SerialName("upsell_ids") val upsellIds: List<Int> = listOf(),
@SerialName("cross_sell_ids") val crossSellIds: List<Int> = listOf(),
@SerialName("parent_id") val parentId: Int = 0,
@SerialName("purchase_note") val purchaseNote: String = "",
val categories: List<ProductCategory> = listOf(),
val images: List<ProductImage> = listOf(),
val attributes: List<ProductAttribute> = listOf(),
val variations: List<Int> = listOf()
)
产品维度:
data class ProductDimensions(
val length: String = "",
val width: String = "",
val height: String = ""
)
产品属性:
data class ProductAttribute(
val id: Int = 0,
val name: String = "",
val position: Int = 0,
val visible: Boolean = false,
val variation: Boolean = false,
val options: List<String> = listOf()
)
产品类别:
data class ProductCategory(
val id: Int = 0,
val name: String = "",
val slug: String = ""
)
产品图片:
data class ProductImage(
val id: Int = 0,
@SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val src: String = "",
val name: String = "",
val alt: String = ""
)
关联的 json 在 pastebin 上 here
我刚刚试过了,无法重现您的问题。您能否提供一个 github 回购协议,我们可以在其中看到问题?
您的 pastebin link 中的 JSON 存在一个问题,即缺少 stock_status
值,所以我遇到了这个错误:kotlinx.serialization.MissingFieldException: Field stock_status is required, but it was missing
然而,一旦我将该值添加到 JSON 中,我就可以很好地反序列化它。
这是我使用的代码:
import kotlinx.serialization.*
import kotlinx.serialization.json.JSON
import java.io.File
val product = JSON(strictMode = false).parseList<Product>(File("./serializationTest.json").readText())
另一件事是根据documentation
Using Kotlin Serialization requires Kotlin compiler 1.3.0 or higher.
Kotlin 1.3 最近才正式发布,所以您可能正在使用候选版本或其他东西,而不是正式版本(它对我有用)?也许将所有依赖项更新到最新版本并重试?
这是一个有效的 cloud9(简单地 运行 ./gradlew run
)解决方案,使用最新版本的 Kotlin (1.3.0) 和序列化 运行time (0.9 .0)
val serializer = Product.serializer().list
val json = JSON.nonstrict.parse<List<Product>>(serializer, jsonString)
请注意,某些属性必须添加 @Optional 注释才能使此序列化与您的示例一起使用,因此是非严格版本的解析。
@Serializable
data class Product(
val id: Int = 0,
val name: String = "",
val slug: String = "",
val permalink: String = "",
@Optional @SerialName("date_created") val dateCreated: String = "",
@SerialName("date_created_gmt") val dateCreatedGmt: String = "",
@SerialName("date_modified") val dateModified: String = "",
@SerialName("date_modified_gmt") val dateModifiedGmt: String = "",
val type: String = "",
val status: String = "",
val featured: Boolean = false,
@SerialName("catalog_visibility") val catalogVisibility: String = "",
val description: String = "",
@SerialName("short_description") val shortDescription: String = "",
val sku: String = "",
val price: String = "",
@SerialName("regular_price") val regularPrice: String = "",
@SerialName("sale_price") val salePrice: String = "",
@SerialName("on_sale") val onSale: Boolean = false,
val purchasable: Boolean = false,
@SerialName("total_sales") val totalSales: Int = 0,
@SerialName("external_url") val externalUrl: String = "",
@SerialName("tax_status") val taxStatus: String = "",
@SerialName("tax_class") val taxClass: String = "",
@SerialName("stock_quantity") val stockQuantity: String = "",
@Optional @SerialName("stock_status") val stockStatus: String = "",
val backorders: String = "",
@SerialName("backorders_allowed") val backordersAllowed: Boolean = false,
val backordered: Boolean = false,
@SerialName("sold_individually") val soldIndividually: Boolean = false,
val weight: String = "",
val dimensions: ProductDimensions = ProductDimensions(),
@SerialName("shipping_required") val shippingRequired: Boolean = false,
@SerialName("shipping_taxable") val shippingTaxable: Boolean = false,
@SerialName("shipping_class") val shippingClass: String = "",
@SerialName("shipping_class_id") val shippingClassId: Int = 0,
@SerialName("reviews_allowed") val reviewsAllowed: Boolean = false,
@SerialName("average_rating") val averageRating: String = "",
@SerialName("rating_count") val ratingCount: Int = 0,
@SerialName("related_ids") val relatedIds: List<Int> = listOf(),
@SerialName("upsell_ids") val upsellIds: List<Int> = listOf(),
@SerialName("cross_sell_ids") val crossSellIds: List<Int> = listOf(),
@SerialName("parent_id") val parentId: Int = 0,
@SerialName("purchase_note") val purchaseNote: String = "",
val categories: List<ProductCategory> = listOf(),
val images: List<ProductImage> = listOf(),
val attributes: List<ProductAttribute> = listOf(),
val variations: List<Int> = listOf()
)
通知:date_created
、stock_status
根据您的 json 原始数据生成数据 class 的一个很好的在线工具是 quicktype.io
编辑:刚发现cloud9两年前被amazon收购了,不能再创建账户查看public workspace。 所以这里是 link to the filesystem