Moshi vs Gson trong Android [đóng]


81

Tôi đang quyết định sử dụng Moshi by square hay Gson để tuần tự hóa và giải mã hóa dữ liệu mô hình.

một điều tôi luôn không thích về Gson là tôi nghĩ nó sử dụng phản chiếu có thể chậm trên Android? Moshi cũng sử dụng phản xạ?

Một số ưu và nhược điểm của moshi vs Gson là gì?

Tôi thấy chúng giống nhau. lấy ví dụ câu lệnh này tạo ra mộttypeAdapter:

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);
    }
  }
}

và để sử dụng nó, hãy đăng ký nó giống như trong gson:

Moshi moshi = new Moshi.Builder()
.add(new CardAdapter())
.build();

Tôi đoán lợi ích sẽ là chú thích được sử dụng trong typeAdapter. Tôi đang tìm hiểu xem có tăng hiệu suất gì không nếu tôi chuyển sang Moshi.

Câu trả lời:


94

Moshi sử dụng Okio để tối ưu hóa một số thứ mà Gson không làm được.

  • Khi đọc tên trường , Moshi không phải cấp phát chuỗi hoặc thực hiện tra cứu mã băm.
  • Moshi quét đầu vào dưới dạng một chuỗi UTF-8 byte, chuyển đổi sang các ký tự Java một cách lười biếng. Ví dụ, nó không bao giờ cần chuyển đổi các ký tự nguyên thành ký tự.

Lợi ích của những tối ưu hóa này đặc biệt rõ rệt nếu bạn đang sử dụng các luồng Okio. Người dùng RetrofitOkHttp nói riêng được hưởng lợi từ Moshi.

Thảo luận thêm về nguồn gốc của Moshi có trong bài đăng của tôi, Moshi, một Bộ xử lý JSON khác .


Liệu nó sử dụng phản ánh
j2emanue

2
@ j2emanue Là một chi tiết triển khai, JsonAdapters mặc định cho các lớp tùy chỉnh của bạn sẽ đặt các trường có phản chiếu.
Eric Cochran

1
@ j2emanue Reflection có thể tránh được bằng cách sử dụng codegen github.com/square/moshi#codegen
Pedro Lopes

34

Theo bình luận của swankjesse trên reddit :

Tôi tự hào về công việc của mình trên Gson, nhưng cũng thất vọng vì một số hạn chế của nó. Tôi muốn giải quyết những vấn đề này, nhưng không phải là “Gson 3.0”, một phần vì tôi không còn làm việc tại Google nữa. Jake, Scott, Eric và tôi đã tạo ra Moshi để giải quyết những hạn chế khác nhau của Gson. Dưới đây là mười lý do nhỏ để thích Moshi hơn Gson:

  1. Hỗ trợ Kotlin sắp tới.

  2. Các bộ định lượng như @HexColor int cho phép nhiều biểu diễn JSON cho một loại Java duy nhất.

  3. @ToJson và @FromJson giúp bạn dễ dàng viết và thử nghiệm các bộ điều hợp JSON tùy chỉnh.

  4. JsonAdapter.failOnUnknown () cho phép bạn từ chối dữ liệu JSON không mong muốn.

  5. Các trường hợp ngoại lệ có thể đoán trước. Moshi ném IOException về các vấn đề IO và JsonDataException về kiểu không khớp. Gson ở khắp nơi.

  6. JsonReader.selectName () tránh phân bổ chuỗi và giải mã UTF-8 không cần thiết trong trường hợp phổ biến.

  7. Bạn sẽ gửi một APK nhỏ hơn. Gson là 227 KiB, Moshi + Okio cộng lại là 200 KiB.

  8. Moshi sẽ không làm rò rỉ chi tiết triển khai của các loại nền tảng vào JSON được mã hóa của bạn. Điều này khiến tôi sợ Gson: gson.toJson (SimpleTimeZone.getTimeZone ("GMT"))

  9. Moshi không thực hiện thoát HTML kỳ lạ theo mặc định. Hãy xem mã hóa mặc định của Gson là "12 & 5 = 4" để làm ví dụ.

  10. Không có bộ điều hợp ngày bị hỏng nào được cài đặt theo mặc định.

Nếu bạn đang viết mã mới, tôi thực sự khuyên bạn nên bắt đầu với Moshi. Nếu bạn đã có một dự án hiện tại với Gson, bạn nên nâng cấp nếu điều đó sẽ đơn giản và không rủi ro. Nếu không, hãy gắn bó với Gson! Tôi đang cố gắng hết sức để đảm bảo nó vẫn tương thích và đáng tin cậy.


1

Từ liên kết trước, bạn có thể thấy rằng việc sử dụng moshi codegen sẽ tạo bộ điều hợp thời gian biên dịch cho các lớp mô hình, điều này sẽ loại bỏ việc sử dụng phản xạ trong thời gian chạy

Mô hình

@JsonClass(generateAdapter = true) 
class MyModel(val blah: Blah, val blah2: Blah)

app / build.gradle

kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"

Sẽ tạo ra một lớp MyModelJsonAdapter với các xác thực để đảm bảo tính vô hiệu của các thuộc tính mô hình.


Bạn sẽ không nghĩ rằng Moshi nhanh hơn?
j2emanue
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.