Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RealmとJSONライブラリ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
zaki50
June 25, 2015
Technology
4.9k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RealmとJSONライブラリ
zaki50
June 25, 2015
More Decks by zaki50
See All by zaki50
I/O Extended 2018 @Tokyo Android1
zaki50
3
1.3k
簡単高速なDIライブラリToothpick
zaki50
1
250
Android Studio 3.0 profilerハンズオン
zaki50
2
810
Realm Japan meetup #23_Java
zaki50
0
770
Realm Japan meetup #22_Java
zaki50
1
590
Realm World Tour Osaka Recent Java Updates
zaki50
0
500
Realm World Tour - ErrorProne in Realm Java
zaki50
2
510
Realm World Tour Tokyo Recent Java Updates
zaki50
2
830
Realm World Tour - ErrorProne in Realm Java
zaki50
1
810
Other Decks in Technology
See All in Technology
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
520
Steerable Visual Representations
sansantech
PRO
0
340
「Docker Desktop不要の時代」は来たのか?」
ueponx
0
100
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
0
160
小規模OSSモデルは サイバーセキュリティ業務に どこまで使えるか
bbrbbq
0
280
sue445's proposals 2026
sue445
0
140
Let's Change Our World—Again
snoozer05
PRO
6
630
macOS Golden Gate 時代のMac管理
tategami
0
140
日本AIベンチャーレポート2026
kentarofujii
0
210
スクラム祭り2026福井トラック_閉じたループから価値のスパイラルへ
kc_nakanishi
0
120
React改造してみた
tsukina_7mochi
0
160
「エーアイ」をバズワードにしないために RPA 導入経験と Kiro 上での Claude モデル利用経験から
kazzpapa3
0
120
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
6.2k
Google's AI Overviews - The New Search
badams
0
1.6k
Code Reviewing Like a Champion
maltzj
529
40k
Abbi's Birthday
coloredviolet
4
10k
A better future with KSS
kneath
240
18k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Deep Space Network (abreviated)
tonyrice
0
380
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
A Tale of Four Properties
chriscoyier
163
24k
Typedesign – Prime Four
hannesfritz
42
3.2k
Transcript
RealmͱJSONϥΠϒϥϦ 2015/6/25 Realm Meetup ࢁ㟒 (@zaki50)
ࣗݾհ • YAMAZAKI Makoto (@zaki50) • גࣜձࣾ uPhyca ॴଐ
ࠓͷ༰ • Realm ϞσϧΛ JSON ʹγϦΞϥΠζ͢Δ • Android(Java)Ͱ͢ • ϝδϟʔͳJSONϥΠϒϥϦͱRealmͷ૬ੑ
• ͦΕͧΕͷ͍ํ
JSONϥΠϒϥϦ • Moshi • Gson • Jackson • JsonPullParser
૬ੑʁ • RealmͷΦϒδΣΫτ͕POJOͰແ͍ ͜ͱʹىҼ͢Δ༷ʑͳ͕ى͜Δ
ϞσϧΫϥε(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は省略 }
ϞσϧΫϥε(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 }
Moshi • https://github.com/square/moshi • Squareࣾ • okioͱ࿈ܞͰ͖ΔͷͰɺOkHttpͱ͏ ͱޮ͕ྑ͍ • ޙड़ͷGsonͱࣅͨAPI
MoshiͰγϦΞϥΠζ User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android",
"HT-03A")); Moshi moshi = new Moshi.Builder().build(); try { JsonAdapter<User> adapter = moshi.adapter(User.class); Log.d("json", adapter.toJson(user)); } catch (Exception e) { Log.d("json", "Moshi: error", e); }
࣮ߦ݁Ռ(Moshi) D/json (16011): java.lang.IllegalArgumentException: No JsonAdapter for java.lang.ref.WeakReference<io.realm.RealmChangeListener> 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)
ݪҼ public class User extends RealmObject { // 省略 }
RealmObject public abstract class RealmObject { protected Row row; protected
Realm realm; // 省略 } public final class Realm implements Closeable { // 省略 private List<WeakReference<RealmChangeListener>> changeListeners = ...; // 省略 }
݁(Moshi) • MoshiରΦϒδΣΫτͷશϑΟʔϧ υΛγϦΞϥΠζ͠Α͏ͱͯ͠͠·͏ɻ • আ֎ࢦఆ͕Ή͔͍ͣ͠ • Realmͱͷ૬ੑ ☓
Gson • https://github.com/google/gson • Googleࣾ • AndroidͷαϯϓϧͰΑ͘༻͞Εͯ ͍Δ • ϝδϟʔΏ͑ͷ҆৺ײ
• RealmެࣜαΠτͰݴٴ͞Ε͍ͯΔ
Realm ެࣜαΠτ https://realm.io/docs/java/latest/#gson
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));
࣮ߦ݁Ռ(Gson) D/json (16011):Gson(stand alone): {"email":"
[email protected]
","fullName":"Makoto Yamazaki","phone":{"os":"Android","type":"HT-03A"}}
None
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));
࣮ߦ݁Ռ2(Gson) D/json (16011):Gson(managed): {}
None
stand-alone vs managed • Stand-alone Object: σʔλϕʔεʹඥ ͍͍ͯͳ͍ΦϒδΣΫτɻgetter ෦ ͷprivateϑΟʔϧυ͔ΒΛฦ͢
• Managed Object: σʔλϕʔεʹඥ͍ ͍ͯΔΦϒδΣΫτɻgetterɺσʔλ ϕʔεʹ֨ೲ͞Ε͍ͯΔΛฦ͢
ݪҼ • GsongetterΛͬͯ͘Εͳ͍ʂ • RealmެࣜαΠτʹɺγϦΞϥΠζ͢ΔͳΒ ΧελϜͷTypeAdapterΛϞσϧΫϥε͝ͱʹ هड़͠Ζͱ͔͍ͯ͋Δ https://gist.github.com/cmelchior/ ddac8efd018123a1e53a
TypeAdapterͷྫ public class PersonSerializer implements JsonSerializer<Person> { @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; } }
݁(Gson) • Gsonඪ४Ͱgetter/setterΛΘͳ ͍ͷͰɺmanaged objectͰࠔΔ • શϞσϧΫϥεʹTypeAdapterॻ͘ͳ͍ ΒJsonObjectͰ࣮͢ΔͷͱมΘΒͳ͍ • Realmͱͷ૬ੑ˚
Jackson • http://wiki.fasterxml.com/ JacksonHome • ΘΓͱߴͳ͜ͱͰ༗໊ • JavaEEք۾Ͱͷ࣮͋Γɺαʔόʔ αΠυͰϝδϟʔ
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));
࣮ߦ݁Ռ(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}
None
Μʁ
࣮ߦ݁Ռ(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}
ݪҼ • JacksongetterΛͬͯ͘ΕΔ • ͔͠͠ɺΫϥεؚΊͯgetterͬΆ͍ϝιου ͕͋Δͱશ෦͏ public abstract class RealmObject
{ // 省略 public boolean isValid() { return row != null && row.isAttached(); } }
ରॲํ๏ @JsonIgnoreProperties({"valid"}) public class User extends RealmObject { private
String email; private String fullName; private Phone phone; // 省略 } • “valid”͕ͳΜͷ͜ͱ͔Θ͔Γʹ͍͘ • কདྷతʹRealmObjectʹϝιου͕૿͕͑ͨ࣌৺
݁(Jackson) • JacksongetterΛͬͯ͘ΕΔͷͰmanaged objectͰγϦΞϥΠζͰ͖Δ • ͔͠͠ɺRealmObject͕ͭgetterͬͯ͠· ͏ͨΊ༨ܭͳͷ͕ࠞೖ͢Δ • গ͠ͷखؒͰճආՄೳ͕ͩόʔδϣϯΞοϓ ͕৺
• Realmͱͷ૬ੑ ̋
JsonPullParser(JPP) • https://github.com/vvakame/JsonPullParser • TOPGATE͕ࣾތΔAndroidΤΩεύʔτvvakameࢯ࡞ • ͚ͬ͜͏ߴ • ݩʑPullParser͕ͩͬͨɺΦϒδΣΫτϚοϐϯά Ͱ͖Δ(ͱ͍͏͔ɺ΄΅ͦΕ͔͍ͬͯ͠ͳ͍)
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());
ϞσϧΫϥε(User) @JsonModel public class User extends RealmObject { @JsonKey private
String email; @JsonKey private String fullName; @JsonKey private Phone phone; // 省略 }
ઃఆ͕ͪΐͬͱ໘ 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' ... }
࣮ߦ݁Ռ(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"}}
None
݁(JPP) • JPPgetterΛͬͯ͘ΕΔͷͰmanaged object ͰγϦΞϥΠζͰ͖Δ • ରͱ͢ΔϑΟʔϧυʹΞϊςʔγϣϯΛ͚ͭΔ ͷͰɺΒͳ͍͏ͪʹ༨ܭͳͷ͕ࠞೖ͠ͳ͍ • ϓϩδΣΫτઃఆ͕গ͚ͩ͠໘
• Realmͱͷ૬ੑ ̋
݁ Moshi<Gson<Jackson<JPP Realmͱͷ૬ੑͰ Έͳ͞ΜJPPΛ͍͖ͬͯ·͠ΐ͏ʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
αϯϓϧίʔυ https://github.com/zaki50/RealmMeetup4