【问题标题】:Moshi vs Gson in android [closed]android中的Moshi vs Gson [关闭]
【发布时间】:2017-09-20 12:24:45
【问题描述】:

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

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

moshi 与 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,我正在寻找是否有任何性能提升。

【问题讨论】:

    标签: android gson deserialization moshi


    【解决方案1】:

    Moshi 使用 Okio 优化了 Gson 没有做的一些事情。

    • reading field names 时,Moshi 不必分配字符串或进行哈希查找。
    • Moshi 将输入扫描为 UTF-8 字节序列,懒惰地转换为 Java 字符。例如,它永远不需要将整数文字转换为字符。

    如果您已经在使用 Okio 流,这些优化的好处会特别明显。 RetrofitOkHttp 的用户尤其受益于 Moshi。

    关于 Moshi 起源的进一步讨论在我的帖子中,Moshi, another JSON Processor

    【讨论】:

    • 是否使用反射
    • @j2emanue 作为实现细节,自定义类的默认 JsonAdapters 将设置具有反射的字段。
    • @j2emanue 使用 codegen 可以避免反射 github.com/square/moshi#codegen
    【解决方案2】:

    根据swankjesse's comment on reddit

    我为我在 Gson 上的工作感到自豪,但也对它的一些局限性感到失望。我想解决这些问题,但不是“Gson 3.0”,部分原因是我不再在 Google 工作。 Jake、Scott、Eric 和我创建了 Moshi 来解决 Gson 的各种限制。以下是比 Gson 更喜欢 Moshi 的十个小理由:

    1. 即将支持 Kotlin。

    2. 像 @HexColor int 这样的限定符允许单一 Java 类型的多个 JSON 表示。

    3. @ToJson 和 @FromJson 使编写和测试自定义 JSON 适配器变得容易。

    4. JsonAdapter.failOnUnknown() 可让您拒绝意外的 JSON 数据。

    5. 可预测的异常。 Moshi 在 IO 问题上抛出 IOException,在类型不匹配时抛出 JsonDataException。 Gson 到处都是。

    6. JsonReader.selectName() 避免了常见情况下不必要的 UTF-8 解码和字符串分配。

    7. 您将发布一个较小的 APK。 Gson 为 227 KiB,Moshi+Okio 加起来为 200 KiB。

    8. Moshi 不会将平台类型的实现细节泄露到您的编码 JSON 中。这让我害怕Gson:gson.toJson(SimpleTimeZone.getTimeZone("GMT"))

    9. 默认情况下,Moshi 不会进行奇怪的 HTML 转义。以 Gson 的默认编码“12 & 5 = 4”为例。

    10. 默认没有安装损坏的日期适配器。

    如果您正在编写新代码,我强烈建议您从 Moshi 开始。如果你有一个使用 Gson 的现有项目,你应该升级,如果这简单且没有风险的话。否则坚持使用Gson!我正在尽最大努力确保它保持兼容和可靠。

    【讨论】:

      【解决方案3】:

      从上一个链接可以看出,使用 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 类,以确保模型属性的可空性。

      【讨论】:

      • 你不觉得说moshi会更快吗?
      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多