質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

4267閲覧

Swift2 RealmオブジェクトをJSON形式に変換する方法

ucan-lab

総合スコア888

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2015/12/27 05:52

Swift2でRealmデータベースを使っています。
PHPとのデータのやり取りをJSON形式で行いたいと思っています。

PHP -> Swiftは特に問題なく行えました。
Swift -> PHPに送る前に、RealmオブジェクトをどうやってJSON形式に変換するかで悩んでいます。

自分でアウトプットを力技で作ることも考えましたが、
モデルの数が多く、今後変更が入った際の修正の手間を考えるとシリアライズしてJSON化したいです。

検討したのが下記のライブラリです。

Realm-JSON
https://github.com/matthewcheok/Realm-JSON

名称からそれっぽいので検討したのですが、Swiftでは動かない?ようです。
https://github.com/matthewcheok/Realm-JSON/issues/37

swift-serialize
https://github.com/sagesse-cn/swift-serialize

オブジェクトをJSONに変換できるみたいですが、中国語でHow toが書かれており、イマイチわからないです。

何か良い方法がありましたらご意見ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JSONからオブジェクトへマッピングするライブラリは選択肢がたくさんあるのですが、JSONにエンコードするものはあまりありません。
その中でRealmをうまく動くものということなら、JSONCodable https://github.com/matthewcheok/JSONCodable が良いと思います。

例えば、このように使います。

public class Event: Object { public dynamic var eventIdentifier: String = "" public dynamic var allDay: Bool = false public dynamic var startDate: NSDate = NSDate() public dynamic var endDate: NSDate = NSDate() public dynamic var title: String = "" public dynamic var location: String? public dynamic var notes: String? public dynamic var URL: String? public dynamic var lastModifiedDate: NSDate? public dynamic var creationDate: NSDate? public dynamic var calendarColor = "FFFFFFFF" public override class func primaryKey() -> String? { return "eventIdentifier" } } extension Event: JSONEncodable { public func toJSON() throws -> AnyObject { return try JSONEncoder.create { encoder in try encoder.encode(eventIdentifier, key: "event_dentifier") try encoder.encode(allDay, key: "all_day") try encoder.encode(startDate, key: "start_date", transformer: JSONTransformers.StringToNSDate) try encoder.encode(endDate, key: "end_date", transformer: JSONTransformers.StringToNSDate) try encoder.encode(title, key: "title") try encoder.encode(location, key: "location") try encoder.encode(notes, key: "notes") try encoder.encode(URL, key: "url") try encoder.encode(lastModifiedDate, key: "last_modified_date", transformer: JSONTransformers.StringToNSDate) try encoder.encode(creationDate, key: "creation_date", transformer: JSONTransformers.StringToNSDate) try encoder.encode(calendarColor, key: "calendar_color") } } }
print(try? event.toJSON())

投稿2015/12/28 01:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ucan-lab

2015/12/28 07:06 編集

回答ありがとうございます。 JSONCodable良さそうですね。 早速試そうと思ったのですが、インストールでつまづいてしまっています。 ◯Podfileの更新 # Uncomment this line to define a global platform for your project source 'https://github.com/CocoaPods/Specs.git' platform :ios, '8.0' # Uncomment this line if you're using Swift use_frameworks! target 'projectName' do pod 'RealmSwift' pod 'Alamofire', '~> 3.0' pod 'JSONCodable', '~> 2.1' end ◯pod 更新でエラー $pod update [!] Unable to satisfy the following requirements: - `JSONCodable (~> 2.1)` required by `Podfile` インストール方法について何か問題がありましたらご教示いただけないでしょうか。
退会済みユーザー

退会済みユーザー

2015/12/28 09:26

CocoaPodsには2.0までしか登録されてないようですね。なのにバージョン'2.1'を指定しているのが原因です。(READMEに2.1とあるのでCocoaPodsの登録を忘れてしまっているのかもしれません。)`pod 'JSONCodable'`として、2.0を入れるか、2.1を使いたい場合は`pod 'JSONCodable', git: 'https://github.com/matthewcheok/JSONCodable', tag: '2.1'`とします。もしくはCarthage経由でインストールすることもできます。
ucan-lab

2015/12/29 10:44

なるほど、ありがとうございます。 教えていただいた内容をPodfileに追記してpod updateするとJSONCodable 2.1を導入できました。 そして、JSONエンコードでJSON型式のAnyObjectが返ってきたことまで確認できました。 ここから PHPに投げるために返ってきたAnyObjectをStringに変換しようと考えています。 JSONEncodableの返り値がAnyObjectなのをStringで返すようにすることって可能でしょうか? これができると返ってきたものをそのまま投げるだけなので凄く便利になるのですが... 何度もすみませんが、もし何か良い方法をご存知でしたらご教示ください。
退会済みユーザー

退会済みユーザー

2015/12/29 14:14

私のコードでいうと`event.toJSON()`としてるところを`event.toJSONString()`とするだけではないでしょうか。
ucan-lab

2016/01/03 02:49

教えていただいた内容で解決いたしました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問