Tag: moshi

使用多输入字段Moshi

我有一些像这样的JSON: { "name" : "Credit Card", "code" : "AUD", "value" : 1000 } 我正在使用Moshi把这个数据结构分解成如下的数据结构: data class Account( @Json(name = "name") val name: String, @Json(name = "currency") val currency: String, @Json(name = "value") val value: Int ) 一切运作良好。 但是,我真的想提取currency和value参数到一个单独的Money对象。 所以我的模型看起来更像: data class Money( @Json(name = "currency") val currency: String, @Json(name = "value") val value: Int ) […]

莫希和Android 2.3.3

我在Android 2.3.3上使用moshi时遇到问题: D/PassAndroid( 1649): java.lang.IllegalArgumentException: cannot construct instances of org.ligi.passandroid.model.pass.PassImpl D/PassAndroid( 1649): at com.squareup.moshi.ClassFactory.get(ClassFactory.java:110) D/PassAndroid( 1649): at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:61) D/PassAndroid( 1649): at com.squareup.moshi.Moshi.adapter(Moshi.java:92) D/PassAndroid( 1649): at com.squareup.moshi.Moshi.adapter(Moshi.java:61) D/PassAndroid( 1649): at org.ligi.passandroid.model.AndroidFileSystemPassStore.save(AndroidFileSystemPassStore.kt:33) D/PassAndroid( 1649): at org.ligi.passandroid.ui.PassListActivity.onFABClick(PassListActivity.java:82) D/PassAndroid( 1649): at org.ligi.passandroid.ui.PassListActivity$$ViewBinder$2.doClick(PassListActivity$$ViewBinder.java:39) D/PassAndroid( 1649): at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22) D/PassAndroid( 1649): at android.view.View.performClick(View.java:2485) D/PassAndroid( 1649): at android.view.View$PerformClick.run(View.java:9080) D/PassAndroid( 1649): at android.os.Handler.handleCallback(Handler.java:587) D/PassAndroid( […]

在Moshi 1.5中使用Kotlin使用KotlinJsonAdapterFactory()时,无法找到类

我面对的问题有点奇怪,因为当我有一个正常的模型类,我用作为改造2的响应模型,我得到一些意想不到的错误,假设 open class Example : RealmObject(){ @Json(name = "token") var token: String? = null @Json(name = "data") var data: RealmList<Data>? = null } 和Data类是 open class Data : RealmObject(){ @Json(name = "info") var info: String? = null } 我的代码崩溃,显示一个ClassNotFoundException(我在调试模式下运行),如果删除KotlinJsonAdapterFactory()崩溃不会发生,但数据值变得不存在,即在调试模式下,它出现,就好像它不存在,即Example的一个对象将只显示标记值,数据不存在,甚至不存在,但我需要KotlinJsonAdapterFactory(),因为我使用annonations,所以上面只是一个实验。 我发现的唯一的解决方案是将两个类都转换为数据类,它完美地工作(当然,我要去除RealmObject扩展,使RealmList一个正常的列表),但我需要扩展RealmObject()类和数据类不能打开Realm db是模型所需要的。 所以我回到1.4删除了KotlinJsonAdapterFactory(),并且一切正常,甚至在似乎是proguard后,所以我应该怎么做才能升级到Moshi 1.5。 此外,我已经更新了我的示例代码中的数据对象是一个RealmList,可能是为什么它被忽略/不存在,当响应来了可能是因为我的RealMe虚拟适配器Moshi被忽略? 我将附上我的moshi片段和改造实例 Moshi`instance Moshi.Builder() .add(KotlinJsonAdapterFactory()) .add(RealmListAdapter.FACTORY) .build() 改造实例 Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(MoshiConverterFactory.create(moshi)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) […]

Android Kotlin中的Moshi – 将ENUM作为MutableMap键在非集成化时转换为字符串

我有一个MutableMap<CryptoTypes, CurrentTradingInfo> ,我想保存在onSaveInstanceState ,并打算使用Moshi来回转换。 CryptoTypes is an ENUM private var tickerData: MutableMap<CryptoTypes, CurrentTradingInfo> = mutableMapOf() fun convertTickerDataJson(): String { val moshi = Moshi.Builder().build() val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) return jsonAdapter.toJson(tickerData) } fun restoreTickerDataFromJson(data: String) { val moshi = Moshi.Builder().build() val jsonAdapter = moshi.adapter<MutableMap<CryptoTypes, CurrentTradingInfo>>(MutableMap::class.java) tickerData = jsonAdapter.fromJson(data) } 数据是正确的序列化,但是当它被反序列化时,它会给我一个MutableMap<String, CurrentTradingInfo>来代替? 在序列化之前,当我在studio中查看我的tickerData映射时,它清楚地将ENUM存储为ENUM 这是反序列化后的地图[注意地图是无序的,我不得不重新运行它,因此地图键以不同的顺序] 它怎么能够给我一个错误的类型的地图? 我做错了什么? 当我尝试访问地图转换后,由于类型错误而导致下面的内容崩溃 […]

Android Kotlin Moshi自定义Json适配器

好吧,所以我有以下Json Pojo: data class JCategory( val id: Int, val name: String, val image: String?, val color: String?, val categories: List<JCategory>?, val products: List<JProduct>? ) 我想写一个海关反序列化器,所以最终的对象将如下所示: data class Category( val id: Int, val name: String, val image: String?, val color: String?, val list: List<Any> ) 基本上,映射是: JCategory -> Category JProduct -> Prod1 / Prod2基于JProduct -> Prod1 […]

Moshi + Kotlin + SealedClass

有没有反序列化json使用的方法 sealed class Layer data class ShapeLayer(var type: LayerType) : Layer data class TextLayer(var type: LayerType) : Layer data class ImageLayer(var type: LayerType) : Layer LayerType只是一些枚举,可以用来区分这个对象应该具有哪种类型。 我想我可以这样添加Adapter: class LayerAdapter{ @FromJson fun fromJson(layerJson: LayerJson): Layer { return when (layerJson.layerType) { LayerType.SHAPE -> PreCompLayer() LayerType.SOLID -> SolidLayer() LayerType.Text -> TextLayer() } } } 其中LayerJson将是所有LayerType的每个可能字段的对象。 现在的问题是: 无法序列化抽象类com.example.models.layers.Layer 我可以尝试使用接口,但是我不认为在这里使用空接口是正确的。

Moshi的定制适配器与RxAndroid&Retrofit&Kotlin

在为Android项目配置Kotlin之后,我写了一个简单的MainActivity.kt 。 它调用Retrofit来获取包含以下数据的JSON文件: { “消息”:“成功”, “user”:{ “用户名”:“Eric” } } 现在我想用Moshi把JSON数据转换成Kotlin类,所以这里有两个类来反映上面的JSON结构: class User(var username:String) UserJson类(var消息:字符串,var用户:用户) 而Moshi的自定义类型适配器: 类UserAdapter { @FromJson fun fromJson(userJson:UserJson):User { Log.d(“MyLog”,“message = $ {userJson.message}”)// =成功 Log.d(“MyLog”,“user = $ {userJson.user}”)// = null 返回userJson.user } } 当它进入函数从fromJson() , userJson.message = "success"的预期。 但奇怪的是, userJson.user是null ,这应该是User(username="Eric") 。 我是Moshi和Kotlin的新手,我已经坚持了这个问题约10个小时。 请帮我一下 感谢您的帮助。 ======================================== 以下是MainActivity.kt的完整代码(仅限50行): class MainActivity:AppCompatActivity(){ 重写fun onCreate(savedInstanceState:Bundle?){ super.onCreate(savedInstanceState) 的setContentView(R.layout.activity_main) […]

Kotlin的Moshi自定义修饰符注释

我有转换一些代码到kotlin的问题。 自定义限定符的注释将被忽略。 我这样定义它们: class ColorAdapter { @ToJson internal fun toJson(@PassDefinitions.HexColor rgb: Int): String { return String.format("#%06x", rgb) } @FromJson @PassDefinitions.HexColor internal fun fromJson(rgb: String): Int { return Color.parseColor(rgb) } } 并试图像这样使用它们: @HexColor override var backgroundColor: Int = 0 但它只是被忽略。