问题标签 [moshi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Moshi 的自定义适配器与 RxAndroid & Retrofit & Kotlin
在为 Android 项目配置 Kotlin 之后,我编写了一个简单的MainActivity.kt
. 它调用 Retrofit 来获取包含以下数据的 JSON 文件:
现在想用 Moshi 将 JSON 数据转换成 Kotlin 的类,所以这里有两个类来体现上面的 JSON 结构:
还有一个 Moshi 的自定义类型适配器:
当它进入函数fromJson()
时,userJson.message = "success"
正如预期的那样。但奇怪的是userJson.user
,null
应该是这样User(username="Eric")
。
我是 Moshi 和 Kotlin 的新手,我已经在这个问题上坚持了大约 10 个小时。请帮帮我。谢谢你的帮助。
=========================================
以下是整个代码MainActivity.kt
(仅 50 行):
是build.gradle
:
再次感谢你。
java - 如何在 Retrofit2 中使用 jsonapi?
我需要在改造 2 中使用jsonapi。我尝试使用moshi-jsonapi但我不能使用 moshi ConverterFactory。
TokenModel.java
测试服务.java:
测试提供者.java:
如果我使用MoshiConverterFactory
make error Unable to create converter for class com.xxx.xxx.model.TokenModel
!
使用改造:
moshi - 如何使用 Moshi 反序列化泛型类型?
假设我们有这个 JSON:
(列表中可能还有更多元素;这仅显示了两个)
我有Car
和Boat
POJO 使用Vehicle
公共字段的基类:
解析这个 JSON 的结果应该是一个List<Vehicle>
. 问题是没有 JSON 解析器会开箱即用地知道__typename
如何区分 aBoat
和 a Car
。
使用 Gson,我可以创建一个JsonDeserializer<Vehicle>
可以检查__typename
字段,确定这是 aCar
还是Boat
,然后使用deserialize()
提供JsonDeserializationContext
的将特定 JSON 对象解析为适当的类型。这工作正常。
但是,我正在构建的特定东西应该支持可插入的 JSON 解析器,我想我会尝试将 Moshi 作为替代解析器。但是,目前 Moshi 文档中没有很好地涵盖这个特殊问题,我很难弄清楚如何最好地解决它。
最接近的类似物JsonDeserializer<T>
是JsonAdapter<T>
. 但是,fromJson()
通过 a JsonReader
,它具有破坏性 API。要找出它是什么__typename
,我必须能够从JsonReader
事件中手动解析所有内容。当我知道正确的具体类型后,我可以调用adapter()
实例Moshi
来尝试调用现有的 Moshi 解析逻辑,但我将消耗来自 的数据JsonReader
并破坏其提供完整对象描述的能力。
另一个类似物JsonDeserializer<Vehicle>
是一个带@FromJson
注释的方法,它返回一个Vehicle
. 但是,我无法确定要传递给该方法的简单事物。我唯一能想到的就是创建另一个 POJO 来表示所有可能字段的联合:
然后,理论上,如果我有@FromJson Vehicle rideLikeTheWind(SemiParsedKindOfVehicle rawVehicle)
一个注册为类型适配器的类Moshi
,Moshi 可能能够将我的 JSON 对象解析为SemiParsedKindOfVehicle
实例并调用rideLikeTheWind()
. 在那里,我会查找__typename
,识别类型,并完全构建Car
orBoat
我自己,返回该对象。
虽然可行,但这比 Gson 方法复杂得多,而且我的Car
/Boat
场景是我需要处理的可能数据结构的简单端。
是否有另一种方法来处理我缺少的 Moshi?
android - JSON API 与 moshi 的关系
我有这个理论上遵循 JSON API 规范的响应 JSON。我正在尝试使用moshi-jsonapi 库进行解析,但我不知道如何解析这种some_objects
关系。在SomeType
班级中,我有一个成员HasMany<SomeObject> someObjects
,并且该班级SomeObject
以适当的方式进行了注释:
但是,在进行解析之后,我将someObjects
成员设为空。有谁知道为什么?
JSON就是这样一个:
android - 安卓中的 Moshi vs Gson
我正在决定是使用Moshi by square还是 Gson 来序列化和反序列化模型数据。
我一直不喜欢 Gson 的一件事是我认为它使用反射在 android 上可能很慢?Moshi 是否也使用反射?
moshi vs Gson 的优缺点是什么?
我认为它们很相似。以这个创建一个typeAdapter:
并使用它像在 gson 中一样注册它:
我想优点是 typeAdapter 中使用的注释。如果我切换到 Moshi,我正在寻找是否有任何性能提升。
java - 在 Moshi 中保存对象关系
我想在用 Moshi 解析它们时保存两个 json 结构之间的关系。
假设存在以下情况:
我想解析这个json结构:
我有以下模型类,用 psudo-java 编写:
我怎样才能使它Item
包含对它的引用Refrigerator
,或者至少是那个Refrigerator
名字的引用?
我虽然想用 Moshi 实现这种行为Adapter
,但我不太清楚它是如何工作的。有没有办法Refrigerator
在它被反序列化后修改它,并触摸它的每一个items
?
moshi - 如何序列化 ArrayList使用适用于 Android 的 Moshi JSON 库
我正在尝试使用 Android 的 Moshi 库将 Java 对象转换为 JSON。该对象包含类型的属性
数组列表 <浮点[]>
我正在注册以下适配器来转换对象。
“toJson”方法失败,出现以下异常:
java.lang.IllegalArgumentException:平台 java.util.ArrayList annotated [] 需要在 com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:50) 在 com.squareup.moshi.Moshi.adapter( Moshi.java:99) 在 com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:90) 在 com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:74) 在 com.squareup.moshi.Moshi.adapter(Moshi.java:99) 在 com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:90) 在 com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter .java:74) 在 com.squareup.moshi.Moshi.adapter(Moshi.java:99) 在 com.squareup.moshi.Moshi.adapter(Moshi.java:57) 在 com.squareup.moshi.CollectionJsonAdapter.newArrayListAdapter(CollectionJsonAdapter.java:51) 在 com.squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:35) 在 com.squareup.moshi.Moshi.adapter(Moshi. java:99) 在 com.squareup.moshi.Moshi.adapter(Moshi.java:57)squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:35) at com.squareup.moshi.Moshi.adapter(Moshi.java:99) at com.squareup.moshi.Moshi.adapter(Moshi.java:57)squareup.moshi.CollectionJsonAdapter$1.create(CollectionJsonAdapter.java:35) at com.squareup.moshi.Moshi.adapter(Moshi.java:99) at com.squareup.moshi.Moshi.adapter(Moshi.java:57)
我认为我的类型定义是错误的,但我似乎找不到正确的值
android - 向 Retrofit 2 抛出自定义错误
我正在尝试使用此代码段https://github.com/square/retrofit/issues/1497与 Moshi 一起抛出自定义 api 错误。
API 的回报是:
{"error":"message"}
{"failure":"message"}
{"success":"message"}
{...}
[{...},{...},...]
HTTP 代码始终为 200。
我的改造界面是:
所以我创建了泛型类:
和转换器:
这在 API 返回错误/失败或成功时工作正常,但在 API 返回数组时不起作用。
我不知道为什么 Moshi 看到 Object 的泛型类型而不是 Array
android - 使用 Moshi 将字符串日期从 json 转换为 Date 对象
与 Gson 你会这样做
并将其传递给改造构建器,Gson 会为您创建一个 Date 对象,Moshi
在 kotlin 类中是否也有一些方法可以做到这一点?
android - 无法使用 Moshi 在 json 中反序列化 long
我知道这是一个非常愚蠢的问题,但是在使用 Moshi a Json 反序列化时遇到了一个奇怪的问题
我的 Json 有这个字段:
“版本”:1499082281552
在我的 pojo 中,我有这个字段:
私人长版;
但我总是得到错误:
如果在我的 json 中有
“版本”:1498564139
一切正常。
更新:
解决了。应该使用 Long 而不是 long。