0
0

More than 1 year has passed since last update.

Couchbase Lite機能解説:JSONデータ操作

Last updated at Posted at 2022-02-07

はじめに

以下のドキュメントの内容をベースに、ドキュメント指向NoSQL組み込みデータベースCouchbase Liteを用いたAndroidアプリ開発におけるJSONデータ操作について、具体的なコードを交えて解説します。

なお、Couchbase Liteについては、Couchbase Mobileアプリケーション開発へのロードマップに記事をまとめている他、(これらの記事を元に構成した)以下の電子書籍を無償で頒布しています。

また、Couchbase Serverの存在意義、機能詳細、利用方法等については、拙著NoSQLドキュメント指向データベースCouchbase Serverファーストステップガイド(インプレスR&D刊)や、NoSQL/JSONデータベースCouchbase Server理解・活用へのロードマップにまとめてある記事をご参考ください。

JSONデータ操作

ドキュメント

Couchbase Liteでは、DocumentとJSON文字列との間の変換がサポートされています。

JSON文字列への変換

DocumenttoJSON()メソッドを使用して、JSON文字列を取り出すことができます。

java
final String json = database.getDocument(docId).toJSON();
`

JSON文字列によるドキュメント作成

JSON文字列を使用してMutableDocumentを初期化することができます。

final MutableDocument document = new MutableDocument(docId, json);

実装サンプル

下記の例では、まず、データベースからドキュメントをJSON文字列として取得し(①)、そのJSON文字列を使用してMutableDocumentを初期化し、別のデータベースに保存しています(②)。最後に、JSONから作成されたドキュメントを取得し、値を出力しています(③)。

final Query listQuery = QueryBuilder
  .select(SelectResult.expression(Meta.id).as("metaId"))
  .from(DataSource.database(srcDb));

for (Result row: listQuery.execute()) {
  final String thisId = row.getString("metaId");

  final String json = srcDb.getDocument(thisId).toJSON(); 
  Log.i(TAG, "JSON String = " + json);

  final MutableDocument hotelFromJSON = new MutableDocument(thisId, json); 

  dstDb.save(hotelFromJSON);

  for (Map.Entry entry: dstDb.getDocument(thisId).toMap().entrySet()) {
    Log.i(TAG, entry.getKey() + " => " + entry.getValue());
  } 
}

クエリ結果

クエリの結果についても、toJSON()メソッドを使用して、JSON文字列に変換することができます。

// Uses Jackson JSON processor
import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();

ArrayList<Hotel> hotels = new ArrayList<Hotel>();

for (Result result : listQuery.execute()) {

  // Get result as JSON string
  String thisJsonString = result.toJSON(); 

  // Get Java  Hashmap from JSON string
  HashMap<String, Object> dictFromJSONstring =
          mapper.readValue(thisJsonString, HashMap.class); 


  // Use created hashmap
  String hotelId = dictFromJSONstring.get("id").toString();
  String hotelType = dictFromJSONstring.get("type").toString();
  String hotelname = dictFromJSONstring.get("name").toString();


  // Get custom object from JSON string
  Hotel thisHotel =
          mapper.readValue(thisJsonString, Hotel.class); 

  hotels.add(thisHotel);

}
// Uses Jackson JSON processor
val mapper = ObjectMapper()
val hotels: ArrayList<Hotel> = ArrayList()

for (result in listQuery.execute()) {

    // Get result as JSON string
    val json = result.toJSON() 

    // Get Hashmap from JSON string
    val dictFromJSONstring = mapper.readValue(json, HashMap::class.java) 

    // Use created hashmap
    val hotelId = dictFromJSONstring["id"].toString() //
    val hotelType = dictFromJSONstring["type"].toString()
    val hotelname = dictFromJSONstring["name"].toString()


    // Get custom object from JSON string
    val thisHotel = mapper.readValue(json, Hotel::class.java) 
    hotels.add(thisHotel)
}
  • ① クエリ結果をJSON文字列として取得
  • ② JSON文字列からネイティブオブジェクトを作成
  • ③ JSONデータから作成されたディクショナリからカスタムオブジェクトを生成

JSON文字列形式

クエリでALLを選択すると、JSON形式は次のようになります。

{
  database-name: {
    key1: "value1",
    keyx: "valuex"
  }
}

クエリでプロパティのサブセットを選択した場合、JSON形式は次のようになります。

{
  key1: "value1",
  keyx: "valuex"
}

ディクショナリ

toJSONtoDictionaryメソッドを使用してディクショナリーオブジェクトとJSONとの間で変換することができます。
JSON文字列として提供されたデータを使用して「MutableDictionaryObject」を初期化します。

final MutableDictionary mDict = new MutableDictionary(JSON); 
Log.i(TAG, mDict.toString());

Log.i(TAG, "Details for: " + mDict.getString("name"));
for (String key: mDict.getKeys()) {
  Log.i(TAG, key + " => " + mDict.getValue(key));
}
val mDict = MutableDictionary(JSON) 
Log.i(TAG, "$mDict")
Log.i(TAG, "Details for: ${mDict.getString("name")}")
for (key in mDict.keys) {
  Log.i(TAG, key + " => " + mDict.getValue(key))
}

配列

toJSON()toArrayメソッドを使用して、配列とJSONとの間で変換することができます。
JSON文字列として提供されたデータを使用してMutableArrayObjectを初期化します。
また、ArrayFragmentオブジェクトをJSON文字列に変換することができます。

例4.JSON文字列としての配列

final MutableArray mArray = new MutableArray(JSON); 

for (int i = 0; i < mArray.count(); i++) { 
  final Dictionary dict = mArray.getDictionary(i);
  Log.i(TAG, dict.getString("name"));
  db.save(new MutableDocument(dict.getString("id"), dict.toMap()));
}

final Array features = db.getDocument("1002").getArray("features"); 
for (Object feature: features.toList()) { Log.i(TAG, feature.toString()); }
Log.i(TAG, features.toJSON()); 
val mArray = MutableArray(JSON) 
for (i in 0 until mArray.count()) {
    mArray.getDictionary(i)?.apply {
        Log.i(TAG, getString("name") ?: "unknown")
        db.save(MutableDocument(getString("id"), toMap()))
    } 
}

db.getDocument("1002")?.getArray("features")?.apply {
    for (feature in toList()) {
        Log.i(TAG, "$feature")
    } 
    Log.i(TAG, toJSON())
} 
  • ① JSON文字列で配列を初期化します
  • ② 配列を使用して新しいドキュメントを作成して保存します
  • ③ 新しいドキュメントからネイティブ配列オブジェクトを取得し、その要素を出力します
  • ④ ドキュメントから配列をJSON文字列として取得します

関連情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0