こんにちは。Timers で Android 版の Pairy と Famm を擔(dān)當(dāng)させていただいております、さわいと申します。今回は、軽量?シンプルな JSON ? POJO ライブラリである Moshi についてポストさせて頂きます。実際に導(dǎo)入する際、こういう Tips が世の中にあればもっと気軽に導(dǎo)入できるかも…という內(nèi)容を焦點(diǎn)に記述した構(gòu)成となっておりますので、そもそも Moshi とはなんぞやという方は、GitHub のページを參照するか、検索してご自身で調(diào)べて下さい。 Moshihttps://github.com/square/moshi 調(diào)べたこと
調(diào)べなかったこと
Tips1. POJOの名前とJSONのフィールド名が異なる際の対応アノテーションがあるので、そこで名前を定義すればOK。 public class Hello { @Nullable @Json(name = "1") private final String one; @NonNull @Json(name = "nick_name") private final String nickName; } 2. 謎の精度を持つタイムスタンプをどう扱うべきかPHPで <?php microtime(true); でタイムスタンプを取ってそのまま返卻するようなAPIだと、例えば NazoTimestamp.java @Retention(RetentionPolicy.RUNTIME) @JsonQualifier public @interface NazoTimestamp { } NazoTimestampAdapter.java public class NazoTimestampAdapter { @ToJson String toJson(@NazoTimestamp BigDecimal bigDecimal) { return bigDecimal.toPlainString(); } @FromJson @NazoTimestamp BigDecimal fromJson(String json) { return new BigDecimal(json); } } あとはMoshiのBuilderにAdapterをかまして、POJO側(cè)では public class Ore { @NonNull @NazoTimestamp private final BigDecimal timestamp; } とすればOK。 3. 型が int か boolean かが不定なフィールドを、統(tǒng)一した boolean 型に変換したい時、どう扱うべきか基本的に2.と同様。 カスタムAdapterを作成する。 public class NazoBoolAdapter { @ToJson String toJson(@NazoBool boolean bool) { return String.valueOf(bool); } @FromJson @NazoBool boolean fromJson(JsonReader reader) throws JsonDataException { try { if (reader.peek().equals(JsonReader.Token.NUMBER)) { return reader.nextInt() == 1; } else if (reader.peek().equals(JsonReader.Token.BOOLEAN)) { return reader.nextBoolean(); } } catch (IOException e) { e.printStackTrace(); } return false; } } @Retention(RetentionPolicy.RUNTIME) @JsonQualifier public @interface NazoBool { } あとは Moshi の Builder に Adapter をかまして、POJO 側(cè)では public class Ore { @NazoBool private final boolean nazoBool; } のように使用すればOK。 4. JSON から POJO に変換する際、Moshi は JSON の値によって POJO にどのような値を代入するのかJSONの値が、POJOで指定された型と異なる場合に関しても、Moshiがどのように変換してくれるかを検証。 整數(shù)系
public class Card { public [short | int | long] number; } {"number": <代入値>}
小數(shù)系
public class Card { public [float | double] number; } "{"number": <代入値>}"
[補(bǔ)足] JSON における數(shù)字型問題Moshi では、int, long, double はNUMBERという概念で認(rèn)識される模様(float は不明だが、double扱い?)。 なので、 {"value": 1.2234322} のように書いても、POJOで定義された型が適切であれば適切にパースしてくれる模様(この場合は float か double を指定するのが正解)。 [補(bǔ)足]:Javaの數(shù)字まわりのデータ型整數(shù)系
小數(shù)系
※Android Java (JDK 7) には unsigned はありません。JDK 8 からです。 String
public class Card { public String name; } {"name": <代入値>}
boolean
public class Card { public boolean isPremium; } {"isPremium": <代入値>}
array, list
public class Card { public [String[] | List<String>] weakTypes; } {"weakTypes": <代入値>}
Object in Object
public class Card { public Frame frame; public static class Frame { String color; int size; } } {"frame": <代入値>}
5. JSON から POJO に変換する際、POJO にフィールドが定義されていても、JSON にはフィールド?値が存在しない場合、Moshi はどのようなデフォルト値を代入するのかこんなデフォルト値が入る。
終わりにJavaのJSONライブラリはいくつかありましたが、Moshiは新しいだけあって、思想や設(shè)計も洗練されており、さらに提供元があのSquare様と、使う側(cè)としてはとても嬉しい限り。 Retrofit2との相性もよく、これから長い付き合いになりそうです。 子育て家族アプリFamm、カップル専用アプリPairyを運(yùn)営する Timers inc. では、現(xiàn)在エンジニアを積極採用中!急成長中のサービスの技術(shù)の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お?dú)葺Xにご連絡(luò)ください! |
|
來自: 昵稱27265735 > 《待分類》