Overview
このガイドでは、C ドライバーで拡張JSON形式を使用する方法を学ぶことができます。
JSON は、オブジェクト、配列、数値、string、ブール値、null の値を表すデータ形式です。この形式は、 MongoDB がデータを保存するために使用する形式であるBSONデータ型のサブセットのみをサポートします。拡張JSON形式はより多くのBSON typesをサポートしており、BSONの各タイプに直接対応するフィールドタイプ情報を表すために "$" のプレフィックスが付いたキーの予約セットを定義します。
これらの形式の違いの詳細については、JSONとBSONのリソースを参照してください。
拡張 JSON 形式
MongoDB拡張JSON は、 BSONデータを表すためのさまざまな string 形式を機能します。異なる形式はそれぞれJSON RFCに準拠し、特定のユースケースを満たしています。
次の表は、各形式について説明します。
名前 | 説明 |
|---|---|
拡張 | 標準形式とも呼ばれるこの JSON 表示では、BSON 型情報の損失が避けられます。 |
緩和モード | 何らかのタイプ情報が失われたBSONドキュメントを記述するJSON表現。 |
Shell | 非推奨。MongoDB shell で使用される構文に一致する JSON 表現。 |
厳密 | 非推奨。この表示は、JSON RFCに完全に準拠したレガシー形式であり、すべてのJSONパーサーで型情報を読み取ることができます。 |
注意
ドライバーは、$uuid拡張JSONタイプを string からサブタイプ 4(BSON_SUBTYPE_UUID)のバイナリデータに解析します。$uuidフィールド解析の詳細については、$uuid フィールドを解析するための特別なルール を参照してください。
これらの形式の詳細については、次のリソースを参照してください。
JSON RFC 公式ドキュメント
MongoDB拡張JSON サーバーマニュアルエントリ
BSON_SUBType_UUID APIドキュメント
拡張 JSON の例
次の例は、それぞれの拡張 JSON 形式で表される ObjectId、date、long 数値フィールドを含むドキュメントを示しています。 表示する例の形式に対応するタブをクリックします。
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": { "$numberLong": "1601499609" }}, "numViews": { "$numberLong": "36520312" } }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": "2020-09-30T18:22:51.648Z" }, "numViews": 36520312 }
{ "_id": ObjectId("573a1391f29313caabcd9637"), "createdAt": ISODate("2020-09-30T18:22:51.648Z"), "numViews": NumberLong("36520312") }
{ "_id": { "$oid": "573a1391f29313caabcd9637" }, "createdAt": { "$date": 1601499609 }, "numViews": { "$numberLong": "36520312" } }
拡張 JSON の読み取り
BSON関数の使用
bson_new_from_json() 関数を呼び出すと、拡張JSON string をBSONドキュメントに読み込むことができます。この関数は、拡張JSON string を解析し、 データを含む bson_t 構造を返します。
次の例は、拡張JSON string の例を bson_tドキュメントに読み込む方法を示しています。
/* Read Extended JSON string to BSON */ const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," "\"myNumber\": {\"$numberLong\": \"4794261\" }}"; bson_error_t error; bson_t *doc = bson_new_from_json ((const uint8_t *)ejson_str, -1, &error);
詳細については、bson_new_from_json() および bson_as_canonical_extended_json() APIドキュメント を参照してください。
BSON JSONリーダーの使用
また、 JSON をBSONに変換するためのストリーミングインターフェースを提供する bson_json_reader_t タイプを使用して、拡張JSON string を解析することもできます。これは、複数のJSONドキュメントをプロセシングする場合や、解析プロセスをより詳細に制御する必要がある場合に特に便利です。
次のコード例は、 bson_json_reader_t を使用して拡張JSON string をBSONドキュメントに変換する方法を示しています。
const char *ejson_str = "{ \"_id\": { \"$oid\": \"507f1f77bcf86cd799439011\"}," "\"myNumber\": {\"$numberLong\": \"4794261\" }}"; bson_json_reader_t *reader; bson_error_t error; bson_t doc = BSON_INITIALIZER; int ret; reader = bson_json_data_reader_new (false, 0); bson_json_data_reader_ingest (reader, (const uint8_t *)ejson_str, strlen (ejson_str)); ret = bson_json_reader_read (reader, &doc, &error); if (ret > 0) { bson_iter_t iter; if (bson_iter_init (&iter, &doc)) { while (bson_iter_next (&iter)) { const char *key = bson_iter_key (&iter); if (strcmp (key, "_id") == 0 && BSON_ITER_HOLDS_OID (&iter)) { const bson_oid_t *oid = bson_iter_oid (&iter); char oid_str[25]; bson_oid_to_string (oid, oid_str); printf ("%s is type: ObjectId\n", oid_str); } if (strcmp (key, "myNumber") == 0 && BSON_ITER_HOLDS_INT64 (&iter)) { int64_t number = bson_iter_int64 (&iter); printf ("%ld is type: int64_t\n", (long)number); } } } } else if (ret < 0) { printf ("Error: %s\n", error.message); } bson_json_reader_destroy (reader); bson_destroy (&doc);
507f1f77bcf86cd799439011 is type: ObjectId 4794261 is type: int64_t
詳しくは、次のAPIドキュメントを参照してください。
拡張 JSON の書込み (write)
bson_as_json_with_opts() 関数を呼び出すと、BSONドキュメントを拡張JSON string として書き込みできます。この関数は、出力形式を指定するためのオプションを使用して、bson_tドキュメントを拡張JSON string に変換します。
次の例は、BSONドキュメントを作成し、緩和形式の拡張JSONとして出力する方法を示しています。
bson_t *doc; bson_oid_t oid; bson_json_opts_t *opts; char *json_str; // Create a BSON document doc = bson_new (); bson_oid_init_from_string (&oid, "507f1f77bcf86cd799439012"); bson_append_oid (doc, "_id", -1, &oid); bson_append_int32 (doc, "myNumber", -1, 11223344); // Configure JSON output options for Relaxed mode opts = bson_json_opts_new (BSON_JSON_MODE_RELAXED, BSON_MAX_LEN_UNLIMITED); // Convert to Extended JSON json_str = bson_as_json_with_opts (doc, NULL, opts); printf ("%s\n", json_str); // Cleanup bson_free (json_str); bson_json_opts_destroy (opts); bson_destroy (doc);
{ "_id" : { "$oid" : "507f1f77bcf86cd799439012" }, "myNumber" : 11223344 }
詳細については、bson_as_json_with_opts() APIドキュメント を参照してください。
API ドキュメント
拡張JSONデータを操作するために使用できる関数とタイプの詳細については、次のAPIドキュメントを参照してください。