Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RealmとJSONライブラリ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
240
Android Studio 3.0 profilerハンズオン
zaki50
2
800
Realm Japan meetup #23_Java
zaki50
0
760
Realm Japan meetup #22_Java
zaki50
1
570
Realm World Tour Osaka Recent Java Updates
zaki50
0
500
Realm World Tour - ErrorProne in Realm Java
zaki50
2
500
Realm World Tour Tokyo Recent Java Updates
zaki50
2
810
Realm World Tour - ErrorProne in Realm Java
zaki50
1
790
Other Decks in Technology
See All in Technology
SRE Next 2026 何でも屋からの脱却
bto
0
1k
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
120
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
450
ボーイスカウトルールでメモリやスキルを改善しよう
azukiazusa1
4
1.5k
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
170
AI時代のYAGNI:「爆速で無駄になった機能」からの学び / 20260720 Naoki Takahashi
shift_evolve
PRO
3
340
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.6k
OPENLOGI Company Profile for engineer
hr01
1
74k
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
CDKで書くECSのベストプラクティス、 改めて考え直す2026 #cdkconf2026
makies
3
840
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
1.5k
カードゲーム作りが教えてくれた プロダクトオーナーシップ
moritamasami
0
110
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
350
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
Deep Space Network (abreviated)
tonyrice
0
230
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
500
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Embracing the Ebb and Flow
colly
88
5.1k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
550
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
530
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
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