Slide 1

Slide 1 text

RealmͱJSONϥΠϒϥϦ 2015/6/25 Realm Meetup ࢁ㟒 ੣ (@zaki50)

Slide 2

Slide 2 text

ࣗݾ঺հ • YAMAZAKI Makoto (@zaki50) • גࣜձࣾ uPhyca ॴଐ

Slide 3

Slide 3 text

ࠓ೔ͷ಺༰ • Realm ϞσϧΛ JSON ʹγϦΞϥΠζ͢Δ࿩ • Android(Java)Ͱ͢ • ϝδϟʔͳJSONϥΠϒϥϦͱRealmͷ૬ੑ • ͦΕͧΕͷ࢖͍ํ

Slide 4

Slide 4 text

JSONϥΠϒϥϦ • Moshi • Gson • Jackson • JsonPullParser

Slide 5

Slide 5 text

૬ੑʁ • RealmͷΦϒδΣΫτ͕POJOͰ͸ແ͍ ͜ͱʹىҼ͢Δ༷ʑͳ໰୊͕ى͜Δ

Slide 6

Slide 6 text

ϞσϧΫϥε(User) public class User extends RealmObject {
 
 private String email;
 private String fullName;
 private Phone phone;
 
 public User() {}
 
 public User(String email, String fullName) {
 this.email = email;
 this.fullName = fullName;
 }
 // getterとsetterは省略
 }

Slide 7

Slide 7 text

ϞσϧΫϥε(Phone) public class Phone extends RealmObject {
 
 private String os;
 private String type; 
 public Phone() {}
 
 public Phone(String os, String type) {
 this.os = os;
 this.type = type;
 } // getterとsetterは(ry
 }

Slide 8

Slide 8 text

Moshi • https://github.com/square/moshi • Squareࣾ੡ • okioͱ࿈ܞͰ͖ΔͷͰɺOkHttpͱ࢖͏ ͱޮ཰͕ྑ͍ • ޙड़ͷGsonͱࣅͨAPI

Slide 9

Slide 9 text

MoshiͰγϦΞϥΠζ User user = new User("[email protected]", "Makoto Yamazaki");
 user(new Phone("Android", "HT-03A"));
 Moshi moshi = new Moshi.Builder().build(); try { JsonAdapter adapter = moshi.adapter(User.class);
 Log.d("json", adapter.toJson(user)); } catch (Exception e) {
 Log.d("json", "Moshi: error", e);
 }

Slide 10

Slide 10 text

࣮ߦ݁Ռ(Moshi) D/json (16011): java.lang.IllegalArgumentException: No JsonAdapter for java.lang.ref.WeakReference annotated [] D/json (16011): at com.squareup.moshi.Moshi.createAdapter(Moshi.java:93) D/json (16011): at com.squareup.moshi.Moshi.adapter(Moshi.java:55) D/json (16011): at com.squareup.moshi.Moshi.adapter(Moshi.java:46)

Slide 11

Slide 11 text

ݪҼ public class User extends RealmObject {
 // 省略
 }

Slide 12

Slide 12 text

RealmObject public abstract class RealmObject {
 protected Row row;
 protected Realm realm;
 // 省略 } public final class Realm implements Closeable {
 // 省略 private List> changeListeners = ...; // 省略 }

Slide 13

Slide 13 text

݁࿦(Moshi) • Moshi͸ର৅ΦϒδΣΫτͷશϑΟʔϧ υΛγϦΞϥΠζ͠Α͏ͱͯ͠͠·͏ɻ • আ֎ࢦఆ͕Ή͔͍ͣ͠ • Realmͱͷ૬ੑ ☓

Slide 14

Slide 14 text

Gson • https://github.com/google/gson • Googleࣾ੡ • AndroidͷαϯϓϧͰ͸Α͘࢖༻͞Εͯ ͍Δ • ϝδϟʔΏ͑ͷ҆৺ײ • RealmެࣜαΠτͰ΋ݴٴ͞Ε͍ͯΔ

Slide 15

Slide 15 text

Realm ެࣜαΠτ https://realm.io/docs/java/latest/#gson

Slide 16

Slide 16 text

GsonͰγϦΞϥΠζ Gson gson = new GsonBuilder()
 .setExclusionStrategies(new ExclusionStrategy() {
 @Override
 public boolean shouldSkipField(FieldAttributes f) {
 return f.getDeclaringClass().equals(RealmObject.class);
 }
 
 @Override
 public boolean shouldSkipClass(Class> clazz) {
 return false;
 }
 }).create();
 
 User user = new User("[email protected]", "Makoto Yamazaki");
 user(new Phone("Android", "HT-03A"));
 Log.d("json", "Gson(stand alone): " + gson.toJson(user));

Slide 17

Slide 17 text

࣮ߦ݁Ռ(Gson) D/json (16011):Gson(stand alone): {"email":"[email protected]","fullName":"Makoto Yamazaki","phone":{"os":"Android","type":"HT-03A"}}

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

GsonͰγϦΞϥΠζ2 Gson gson = new GsonBuilder()
 .setExclusionStrategies(new ExclusionStrategy() { // 省略
 }).create();
 
 User user = new User("[email protected]", "Makoto Yamazaki");
 user(new Phone("Android", “HT-03A")); 
 realm.beginTransaction();
 {
 user = realm.copyToRealm(standAloneUser);
 }
 realm.commitTransaction();
 Log.d("json", "Gson(managed): " + gson.toJson(user));

Slide 20

Slide 20 text

࣮ߦ݁Ռ2(Gson) D/json (16011):Gson(managed): {}

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

stand-alone vs managed • Stand-alone Object: σʔλϕʔεʹඥ෇ ͍͍ͯͳ͍ΦϒδΣΫτɻgetter ͸಺෦ ͷprivateϑΟʔϧυ͔Β஋Λฦ͢ • Managed Object: σʔλϕʔεʹඥ෇͍ ͍ͯΔΦϒδΣΫτɻgetter͸ɺσʔλ ϕʔεʹ֨ೲ͞Ε͍ͯΔ஋Λฦ͢

Slide 23

Slide 23 text

ݪҼ • Gson͸getterΛ࢖ͬͯ͘Εͳ͍ʂ • RealmެࣜαΠτʹ΋ɺγϦΞϥΠζ͢ΔͳΒ ΧελϜͷTypeAdapterΛϞσϧΫϥε͝ͱʹ هड़͠Ζͱ͔͍ͯ͋Δ https://gist.github.com/cmelchior/ ddac8efd018123a1e53a

Slide 24

Slide 24 text

TypeAdapterͷྫ public class PersonSerializer implements JsonSerializer { @Override public JsonElement serialize(Person src, Type typeOfSrc, JsonSerializationContext context) { final JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("name", src.getName()); jsonObject.addProperty("age", src.getAge()); jsonObject.add(“favoriteDog", context.serialize(src.getFavoriteDog())); jsonObject.add("dogs", context.serialize(src.getDogs())); return jsonObject; } }

Slide 25

Slide 25 text

݁࿦(Gson) • Gson͸ඪ४Ͱ͸getter/setterΛ࢖Θͳ ͍ͷͰɺmanaged objectͰࠔΔ • શϞσϧΫϥεʹTypeAdapterॻ͘ͳ͍ ΒJsonObjectͰ࣮૷͢ΔͷͱมΘΒͳ͍ • Realmͱͷ૬ੑ˚

Slide 26

Slide 26 text

Jackson • http://wiki.fasterxml.com/ JacksonHome • ΘΓͱߴ଎ͳ͜ͱͰ༗໊ • JavaEEք۾Ͱͷ࣮੷΋͋Γɺαʔόʔ αΠυͰ͸ϝδϟʔ

Slide 27

Slide 27 text

JacksonͰγϦΞϥΠζ User user = new User("[email protected]", "Makoto Yamazaki");
 user(new Phone("Android", "HT-03A"));
 final ObjectMapper mapper = new ObjectMapper();
 
 Log.d("json", "Jackson(stand alone): " + mapper.writeValueAsString(user)); 
 realm.beginTransaction();
 {
 user = realm.copyToRealm(standAloneUser);
 }
 realm.commitTransaction();
 
 Log.d("json", "Jackson(managed): " + mapper.writeValueAsString(user));


Slide 28

Slide 28 text

࣮ߦ݁Ռ(Jsckson) D/json (16011): Jackson(stand alone): {"email":"[email protected]","fullName":"Makoto Yamazaki”,”phone": {"os":"Android","type":"HT-03A","valid":false}, "valid":false} D/json (16011): Jackson(managed): {"email":"[email protected]","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A","valid":true}," valid":true}

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

Μʁ

Slide 31

Slide 31 text

࣮ߦ݁Ռ(Jackson) D/json (16011): Jackson(stand alone): {"email":"[email protected]","fullName":"Makoto Yamazaki”,"phone": {"os":"Android","type":"HT-03A","valid":false}, "valid":false} D/json (16011): Jackson(managed): {"email":"[email protected]","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A","valid":true}," valid":true}

Slide 32

Slide 32 text

ݪҼ • Jackson͸getterΛ࢖ͬͯ͘ΕΔ • ͔͠͠ɺ਌Ϋϥε΋ؚΊͯgetterͬΆ͍ϝιου ͕͋Δͱશ෦࢖͏ public abstract class RealmObject { // 省略 public boolean isValid() {
 return row != null && row.isAttached();
 }
 }

Slide 33

Slide 33 text

ରॲํ๏ @JsonIgnoreProperties({"valid"}) public class User extends RealmObject {
 
 private String email;
 private String fullName;
 private Phone phone;
 
 // 省略
 } • “valid”͕ͳΜͷ͜ͱ͔Θ͔Γʹ͍͘ • কདྷతʹRealmObjectʹϝιου͕૿͕͑ͨ࣌৺഑

Slide 34

Slide 34 text

݁࿦(Jackson) • Jackson͸getterΛ࢖ͬͯ͘ΕΔͷͰmanaged objectͰ΋γϦΞϥΠζͰ͖Δ • ͔͠͠ɺRealmObject͕΋ͭgetter΋࢖ͬͯ͠· ͏ͨΊ༨ܭͳ΋ͷ͕ࠞೖ͢Δ • গ͠ͷखؒͰճආ͸Մೳ͕ͩόʔδϣϯΞοϓ ͕৺഑ • Realmͱͷ૬ੑ ̋

Slide 35

Slide 35 text

JsonPullParser(JPP) • https://github.com/vvakame/JsonPullParser • TOPGATE͕ࣾތΔAndroidΤΩεύʔτvvakameࢯ࡞ • ͚ͬ͜͏ߴ଎ • ݩʑ͸PullParser͕ͩͬͨɺΦϒδΣΫτϚοϐϯά ΋Ͱ͖Δ(ͱ͍͏͔ɺ΄΅ͦΕ͔͠࢖͍ͬͯͳ͍)

Slide 36

Slide 36 text

JPPͰγϦΞϥΠζ User user = new User("[email protected]", "Makoto Yamazaki");
 user(new Phone("Android", "HT-03A"));
 StringWriter writer = new StringWriter();
 UserGen.encode(writer, user);
 writer.close();
 
 Log.d("json", "JPP(stand alone): " + writer.toString());
 
 realm.beginTransaction();
 user = realm.copyToRealm(standAloneUser);
 realm.commitTransaction();
 
 writer = new StringWriter();
 UserGen.encode(writer, user);
 writer.close();
 
 Log.d("json", "JPP(managed): " + writer.toString());

Slide 37

Slide 37 text

ϞσϧΫϥε(User) @JsonModel public class User extends RealmObject { @JsonKey private String email; @JsonKey private String fullName; @JsonKey private Phone phone;
 
 // 省略
 }

Slide 38

Slide 38 text

ઃఆ͕ͪΐͬͱ໘౗ buildscript {
 ...
 dependencies {
 classpath 'com.android.tools.build:gradle:1.2.3'
 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
 }
 }
 apply plugin: 'com.android.application'
 apply plugin: 'com.neenbedankt.android-apt'
 ... dependencies { ...
 compile ‘net.vvakame:jsonpullparser-core:1.6.2' apt ‘net.vvakame:jsonpullparser-apt:1.6.2' ...
 }

Slide 39

Slide 39 text

࣮ߦ݁Ռ(JPP) D/json (16011): JPP(stand alone): {"email":"[email protected]","fullName":"Makoto Yamazaki”,"phone": {"os":"Android","type":"HT-03A"}} D/json (16011): JPP(managed): {"email":"[email protected]","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A"}}

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

݁࿦(JPP) • JPP͸getterΛ࢖ͬͯ͘ΕΔͷͰmanaged object Ͱ΋γϦΞϥΠζͰ͖Δ • ର৅ͱ͢ΔϑΟʔϧυʹΞϊςʔγϣϯΛ͚ͭΔ ͷͰɺ஌Βͳ͍͏ͪʹ༨ܭͳ΋ͷ͕ࠞೖ͠ͳ͍ • ϓϩδΣΫτઃఆ͕গ͚ͩ͠໘౗ • Realmͱͷ૬ੑ ̋

Slide 42

Slide 42 text

݁࿦ Moshi

Slide 43

Slide 43 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 44

Slide 44 text

αϯϓϧίʔυ https://github.com/zaki50/RealmMeetup4