我决定是使用Moshi by square还是Gson来序列化和反序列化模型数据。
我总是不喜欢Gson的一件事是我认为它使用的反射在Android上可能很慢?莫希也使用反射吗?
moshi vs Gson的优点和缺点是什么?
我认为它们相似。以此语句为例,创建一个typeAdapter:
class CardAdapter {
@ToJson String toJson(Card card) {
return card.rank + card.suit.name().substring(0, 1);
}
@FromJson Card fromJson(String card) {
if (card.length() != 2) throw new JsonDataException("Unknown card: " + card);
char rank = card.charAt(0);
switch (card.charAt(1)) {
case 'C': return new Card(rank, Suit.CLUBS);
case 'D': return new Card(rank, Suit.DIAMONDS);
case 'H': return new Card(rank, Suit.HEARTS);
case 'S': return new Card(rank, Suit.SPADES);
default: throw new JsonDataException("unknown suit: " + card);
}
}
}
并使用它就像在gson中一样注册它:
Moshi moshi = new Moshi.Builder()
.add(new CardAdapter())
.build();
我猜测优势将是typeAdapter中使用的注释。如果我切换到Moshi,我想知道是否有任何性能提升。
答案 0 :(得分:69)
Moshi使用Okio来优化Gson没有的一些东西。
如果您已经在使用Okio流,这些优化的好处尤其明显。 Retrofit和OkHttp的用户尤其受益于Moshi。
关于莫希起源的进一步讨论在我的帖子中Moshi, another JSON Processor。
答案 1 :(得分:7)
根据swankjesse's comment on reddit:
我为我在Gson上的工作感到自豪,但也对其某些局限性感到失望。我想解决这些问题,而不是“ Gson 3.0”,部分原因是我不再在Google工作。 杰克(Jake),斯科特(Scott),埃里克(Eric)和我创建了Moshi来解决Gson的各种限制。这是十个比Mson胜过Gson的小理由:
即将获得Kotlin支持。
@HexColor int之类的限定符允许单个Java类型使用多个JSON表示形式。
通过@ToJson和@FromJson可以轻松编写和测试自定义JSON适配器。
JsonAdapter.failOnUnknown()允许您拒绝意外的JSON数据。
可预测的异常。 Moshi针对IO问题抛出IOException,而针对类型不匹配抛出JsonDataException。吉森到处都是。
JsonReader.selectName()在常见情况下避免了不必要的UTF-8解码和字符串分配。
您将发布一个较小的APK。 Gson是227 KiB,Moshi + Okio总共是200 KiB。
Moshi不会将平台类型的实现详细信息泄漏到编码的JSON中。这让我担心Gson:gson.toJson(SimpleTimeZone.getTimeZone(“ GMT”))
Moshi默认不进行奇怪的HTML转义。以Gson的默认编码“ 12&5 = 4”为例。
默认情况下未安装任何损坏的日期适配器。
如果您要编写新代码,强烈建议从Moshi开始。如果您有与Gson一起的现有项目,则应该进行升级,否则升级会很简单且没有风险。否则,请坚持使用Gson!我正在尽力确保它保持兼容和可靠。
答案 2 :(得分:1)
从上一个链接中可以看到,使用moshi codegen将为模型类创建编译时适配器,这将消除运行时反射的使用
型号
@JsonClass(generateAdapter = true)
class MyModel(val blah: Blah, val blah2: Blah)
app / build.gradle
kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"
将生成带有验证的MyModelJsonAdapter类,以确保模型属性的无效性。