问题标签 [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.

0 投票
2 回答
5153 浏览

android - Moshi 的自定义适配器与 RxAndroid & Retrofit & Kotlin

在为 Android 项目配置 Kotlin 之后,我编写了一个简单的MainActivity.kt. 它调用 Retrofit 来获取包含以下数据的 JSON 文件:

现在想用 Moshi 将 JSON 数据转换成 Kotlin 的类,所以这里有两个类来体现上面的 JSON 结构:

还有一个 Moshi 的自定义类型适配器:

当它进入函数fromJson()时,userJson.message = "success"正如预期的那样。但奇怪的是userJson.usernull应该是这样User(username="Eric")

我是 Moshi 和 Kotlin 的新手,我已经在这个问题上坚持了大约 10 个小时。请帮帮我。谢谢你的帮助。

=========================================

以下是整个代码MainActivity.kt(仅 50 行):

build.gradle

再次感谢你。

0 投票
1 回答
791 浏览

java - 如何在 Retrofit2 中使用 jsonapi?

我需要在改造 2 中使用jsonapi。我尝试使用moshi-jsonapi但我不能使用 moshi ConverterFactory。

TokenModel.java

测试服务.java:

测试提供者.java:

如果我使用MoshiConverterFactorymake error Unable to create converter for class com.xxx.xxx.model.TokenModel

使用改造:

0 投票
2 回答
6660 浏览

moshi - 如何使用 Moshi 反序列化泛型类型?

假设我们有这个 JSON:

(列表中可能还有更多元素;这仅显示了两个)

我有CarBoatPOJO 使用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,识别类型,并完全构建CarorBoat我自己,返回该对象。

虽然可行,但这比 Gson 方法复杂得多,而且我的Car/Boat场景是我需要处理的可能数据结构的简单端。

是否有另一种方法来处理我缺少的 Moshi?

0 投票
1 回答
654 浏览

android - JSON API 与 moshi 的关系

我有这个理论上遵循 JSON API 规范的响应 JSON。我正在尝试使用moshi-jsonapi 库进行解析,但我不知道如何解析这种some_objects关系。在SomeType班级中,我有一个成员HasMany<SomeObject> someObjects,并且该班级SomeObject以适当的方式进行了注释:

但是,在进行解析之后,我将someObjects成员设为空。有谁知道为什么?

JSON就是这样一个:

0 投票
3 回答
29647 浏览

android - 安卓中的 Moshi vs Gson

我正在决定是使用Moshi by square还是 Gson 来序列化和反序列化模型数据。

我一直不喜欢 Gson 的一件事是我认为它使用反射在 android 上可能很慢?Moshi 是否也使用反射?

moshi vs Gson 的优缺点是什么?

我认为它们很相似。以这个创建一个typeAdapter:

并使用它像在 gson 中一样注册它:

我想优点是 typeAdapter 中使用的注释。如果我切换到 Moshi,我正在寻找是否有任何性能提升。

0 投票
0 回答
111 浏览

java - 在 Moshi 中保存对象关系

我想在用 Moshi 解析它们时保存两个 json 结构之间的关系。

假设存在以下情况:

我想解析这个json结构:

我有以下模型类,用 psudo-java 编写:

我怎样才能使它Item包含对它的引用Refrigerator,或者至少是那个Refrigerator名字的引用?

我虽然想用 Moshi 实现这种行为Adapter,但我不太清楚它是如何工作的。有没有办法Refrigerator在它被反序列化后修改它,并触摸它的每一个items

0 投票
3 回答
7554 浏览

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)

我认为我的类型定义是错误的,但我似乎找不到正确的值

0 投票
0 回答
1262 浏览

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

0 投票
2 回答
12227 浏览

android - 使用 Moshi 将字符串日期从 json 转换为 Date 对象

与 Gson 你会这样做

并将其传递给改造构建器,Gson 会为您创建一个 Date 对象,Moshi在 kotlin 类中是否也有一些方法可以做到这一点?

0 投票
0 回答
141 浏览

android - 无法使用 Moshi 在 json 中反序列化 long

我知道这是一个非常愚蠢的问题,但是在使用 Moshi a Json 反序列化时遇到了一个奇怪的问题

我的 Json 有这个字段:

“版本”:1499082281552

在我的 pojo 中,我有这个字段:

私人长版;

但我总是得到错误:

如果在我的 json 中有

“版本”:1498564139

一切正常。

更新

解决了。应该使用 Long 而不是 long。