[要約] RFC 6902は、JSONドキュメントの変更を表現するためのパッチ形式を定義しています。目的は、JSONデータの部分的な更新や変更を効率的に行うことです。

Internet Engineering Task Force (IETF)                     P. Bryan, Ed.
Request for Comments: 6902                                Salesforce.com
Category: Standards Track                             M. Nottingham, Ed.
ISSN: 2070-1721                                                   Akamai
                                                              April 2013
        

JavaScript Object Notation (JSON) Patch

JavaScript Object Notation(JSON)パッチ

Abstract

概要

JSON Patch defines a JSON document structure for expressing a sequence of operations to apply to a JavaScript Object Notation (JSON) document; it is suitable for use with the HTTP PATCH method. The "application/json-patch+json" media type is used to identify such patch documents.

JSONパッチは、JavaScript Object Notation(JSON)ドキュメントに適用する一連の操作を表現するためのJSONドキュメント構造を定義します。 HTTP PATCHメソッドでの使用に適しています。 「application / json-patch + json」メディアタイプは、そのようなパッチドキュメントを識別するために使用されます。

Status of This Memo

本文書の状態

This is an Internet Standards Track document.

これはInternet Standards Trackドキュメントです。

This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in Section 2 of RFC 5741.

このドキュメントは、IETF(Internet Engineering Task Force)の製品です。これは、IETFコミュニティのコンセンサスを表しています。公開レビューを受け、インターネットエンジニアリングステアリンググループ(IESG)による公開が承認されました。インターネット標準の詳細については、RFC 5741のセクション2をご覧ください。

Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at http://www.rfc-editor.org/info/rfc6902.

このドキュメントの現在のステータス、エラータ、およびフィードバックの提供方法に関する情報は、http://www.rfc-editor.org/info/rfc6902で入手できます。

Copyright Notice

著作権表示

Copyright (c) 2013 IETF Trust and the persons identified as the document authors. All rights reserved.

Copyright(c)2013 IETF Trustおよびドキュメントの作成者として識別された人物。全著作権所有。

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.

この文書は、BCP 78およびこの文書の発行日に有効なIETF文書に関するIETFトラストの法的規定(http://trustee.ietf.org/license-info)の対象となります。これらのドキュメントは、このドキュメントに関するあなたの権利と制限を説明しているため、注意深く確認してください。このドキュメントから抽出されたコードコンポーネントには、Trust Legal Provisionsのセクション4.eに記載されているSimplified BSD Licenseのテキストが含まれている必要があり、Simplified BSD Licenseに記載されているように保証なしで提供されます。

Table of Contents

目次

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
   2.  Conventions  . . . . . . . . . . . . . . . . . . . . . . . . .  3
   3.  Document Structure . . . . . . . . . . . . . . . . . . . . . .  3
   4.  Operations . . . . . . . . . . . . . . . . . . . . . . . . . .  4
     4.1.  add  . . . . . . . . . . . . . . . . . . . . . . . . . . .  4
     4.2.  remove . . . . . . . . . . . . . . . . . . . . . . . . . .  6
     4.3.  replace  . . . . . . . . . . . . . . . . . . . . . . . . .  6
     4.4.  move . . . . . . . . . . . . . . . . . . . . . . . . . . .  6
     4.5.  copy . . . . . . . . . . . . . . . . . . . . . . . . . . .  7
     4.6.  test . . . . . . . . . . . . . . . . . . . . . . . . . . .  7
   5.  Error Handling . . . . . . . . . . . . . . . . . . . . . . . .  8
   6.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . .  9
   7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 10
   8.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 10
   9.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 10
     9.1.  Normative References . . . . . . . . . . . . . . . . . . . 10
     9.2.  Informative References . . . . . . . . . . . . . . . . . . 10
   Appendix A.  Examples  . . . . . . . . . . . . . . . . . . . . . . 12
     A.1.  Adding an Object Member  . . . . . . . . . . . . . . . . . 12
     A.2.  Adding an Array Element  . . . . . . . . . . . . . . . . . 12
     A.3.  Removing an Object Member  . . . . . . . . . . . . . . . . 12
     A.4.  Removing an Array Element  . . . . . . . . . . . . . . . . 13
     A.5.  Replacing a Value  . . . . . . . . . . . . . . . . . . . . 13
     A.6.  Moving a Value . . . . . . . . . . . . . . . . . . . . . . 14
     A.7.  Moving an Array Element  . . . . . . . . . . . . . . . . . 14
     A.8.  Testing a Value: Success . . . . . . . . . . . . . . . . . 15
     A.9.  Testing a Value: Error . . . . . . . . . . . . . . . . . . 15
     A.10. Adding a Nested Member Object  . . . . . . . . . . . . . . 15
     A.11. Ignoring Unrecognized Elements . . . . . . . . . . . . . . 16
     A.12. Adding to a Nonexistent Target . . . . . . . . . . . . . . 16
     A.13. Invalid JSON Patch Document  . . . . . . . . . . . . . . . 17
     A.14. ~ Escape Ordering  . . . . . . . . . . . . . . . . . . . . 17
     A.15. Comparing Strings and Numbers  . . . . . . . . . . . . . . 17
     A.16. Adding an Array Value  . . . . . . . . . . . . . . . . . . 18
        
1. Introduction
1. はじめに

JavaScript Object Notation (JSON) [RFC4627] is a common format for the exchange and storage of structured data. HTTP PATCH [RFC5789] extends the Hypertext Transfer Protocol (HTTP) [RFC2616] with a method to perform partial modifications to resources.

JavaScript Object Notation(JSON)[RFC4627]は、構造化データの交換と保存のための一般的な形式です。 HTTP PATCH [RFC5789]は、ハイパーテキスト転送プロトコル(HTTP)[RFC2616]を拡張して、リソースに対して部分的な変更を実行するメソッドを備えています。

JSON Patch is a format (identified by the media type "application/ json-patch+json") for expressing a sequence of operations to apply to a target JSON document; it is suitable for use with the HTTP PATCH method.

JSONパッチは、ターゲットJSONドキュメントに適用する一連の操作を表現するためのフォーマット(メディアタイプ「application / json-patch + json」で識別)です。 HTTP PATCHメソッドでの使用に適しています。

This format is also potentially useful in other cases in which it is necessary to make partial updates to a JSON document or to a data structure that has similar constraints (i.e., they can be serialized as an object or an array using the JSON grammar).

この形式は、JSONドキュメントまたは同様の制約を持つデータ構造(つまり、JSON文法を使用してオブジェクトまたは配列としてシリアル化できる)を部分的に更新する必要がある他の場合にも役立つ可能性があります。

2. Conventions
2. 規約

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119].

このドキュメントのキーワード「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、および「OPTIONAL」は、 RFC 2119 [RFC2119]で説明されているように解釈されます。

3. Document Structure
3. ドキュメント構造

A JSON Patch document is a JSON [RFC4627] document that represents an array of objects. Each object represents a single operation to be applied to the target JSON document.

JSONパッチドキュメントは、オブジェクトの配列を表すJSON [RFC4627]ドキュメントです。各オブジェクトは、ターゲットJSONドキュメントに適用される単一の操作を表します。

The following is an example JSON Patch document, transferred in an HTTP PATCH request:

以下は、HTTP PATCHリクエストで転送されたJSONパッチドキュメントの例です。

   PATCH /my/data HTTP/1.1
   Host: example.org
   Content-Length: 326
   Content-Type: application/json-patch+json
   If-Match: "abc123"
        
   [
     { "op": "test", "path": "/a/b/c", "value": "foo" },
     { "op": "remove", "path": "/a/b/c" },
     { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
     { "op": "replace", "path": "/a/b/c", "value": 42 },
     { "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
     { "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
   ]
   Evaluation of a JSON Patch document begins against a target JSON
   document.  Operations are applied sequentially in the order they
   appear in the array.  Each operation in the sequence is applied to
   the target document; the resulting document becomes the target of the
   next operation.  Evaluation continues until all operations are
   successfully applied or until an error condition is encountered.
        
4. Operations
4. 操作

Operation objects MUST have exactly one "op" member, whose value indicates the operation to perform. Its value MUST be one of "add", "remove", "replace", "move", "copy", or "test"; other values are errors. The semantics of each object is defined below.

オペレーションオブジェクトは、1つの「op」メンバーを持たなければなりません。その値は、実行するオペレーションを示します。その値は、「追加」、「削除」、「置換」、「移動」、「コピー」、または「テスト」のいずれかでなければなりません。その他の値はエラーです。各オブジェクトの意味は以下に定義されています。

Additionally, operation objects MUST have exactly one "path" member. That member's value is a string containing a JSON-Pointer value [RFC6901] that references a location within the target document (the "target location") where the operation is performed.

さらに、操作オブジェクトには正確に1つの「パス」メンバーが必要です。そのメンバーの値は、操作が実行されるターゲットドキュメント内の場所(「ターゲット場所」)を参照するJSON-Pointer値[RFC6901]を含む文字列です。

The meanings of other operation object members are defined by operation (see the subsections below). Members that are not explicitly defined for the operation in question MUST be ignored (i.e., the operation will complete as if the undefined member did not appear in the object).

他の操作オブジェクトメンバーの意味は、操作によって定義されます(以下のサブセクションを参照)。問題の操作に対して明示的に定義されていないメンバーは無視する必要があります(つまり、未定義のメンバーがオブジェクトに表示されなかったかのように操作が完了します)。

Note that the ordering of members in JSON objects is not significant; therefore, the following operation objects are equivalent:

JSONオブジェクトのメンバーの順序は重要ではないことに注意してください。したがって、次の操作オブジェクトは同等です。

   { "op": "add", "path": "/a/b/c", "value": "foo" }
   { "path": "/a/b/c", "op": "add", "value": "foo" }
   { "value": "foo", "path": "/a/b/c", "op": "add" }
        

Operations are applied to the data structures represented by a JSON document, i.e., after any unescaping (see [RFC4627], Section 2.5) takes place.

操作は、JSONドキュメントで表されるデータ構造に適用されます。つまり、エスケープ解除([RFC4627]、セクション2.5を参照)が行われた後です。

4.1. add
4.1. 追加

The "add" operation performs one of the following functions, depending upon what the target location references:

「追加」操作は、ターゲットの場所が何を参照しているかに応じて、次のいずれかの機能を実行します。

o If the target location specifies an array index, a new value is inserted into the array at the specified index.

o ターゲットの場所が配列インデックスを指定している場合、新しい値が指定されたインデックスの配列に挿入されます。

o If the target location specifies an object member that does not already exist, a new member is added to the object.

o ターゲットの場所で、まだ存在していないオブジェクトメンバーが指定されている場合、新しいメンバーがオブジェクトに追加されます。

o If the target location specifies an object member that does exist, that member's value is replaced.

o ターゲットの場所で、存在するオブジェクトメンバーが指定されている場合、そのメンバーの値が置き換えられます。

The operation object MUST contain a "value" member whose content specifies the value to be added.

操作オブジェクトには、コンテンツが追加される値を指定する「値」メンバーが含まれている必要があります。

For example:

例えば:

   { "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] }
        

When the operation is applied, the target location MUST reference one of:

操作が適用されるとき、ターゲットの場所は次のいずれかを参照する必要があります。

o The root of the target document - whereupon the specified value becomes the entire content of the target document.

o ターゲットドキュメントのルート-指定すると、指定した値がターゲットドキュメントのコンテンツ全体になります。

o A member to add to an existing object - whereupon the supplied value is added to that object at the indicated location. If the member already exists, it is replaced by the specified value.

o 既存のオブジェクトに追加するメンバー-すると、指定された場所でそのオブジェクトの指定された値が追加されます。メンバーがすでに存在する場合は、指定された値に置き換えられます。

o An element to add to an existing array - whereupon the supplied value is added to the array at the indicated location. Any elements at or above the specified index are shifted one position to the right. The specified index MUST NOT be greater than the number of elements in the array. If the "-" character is used to index the end of the array (see [RFC6901]), this has the effect of appending the value to the array.

o 既存の配列に追加する要素-指定すると、指定された場所の配列に指定された値が追加されます。指定されたインデックス以上の要素は、1つ右にシフトされます。指定されたインデックスは、配列内の要素の数を超えてはなりません(MUST NOT)。 「-」文字を使用して配列の最後にインデックスを付ける場合([RFC6901]を参照)、これは値を配列に追加する効果があります。

Because this operation is designed to add to existing objects and arrays, its target location will often not exist. Although the pointer's error handling algorithm will thus be invoked, this specification defines the error handling behavior for "add" pointers to ignore that error and add the value as specified.

この操作は既存のオブジェクトと配列に追加するように設計されているため、そのターゲットの場所が存在しないことがよくあります。このようにしてポインターのエラー処理アルゴリズムが呼び出されますが、この仕様では、「追加」ポインターがそのエラーを無視して指定された値を追加するためのエラー処理動作を定義しています。

However, the object itself or an array containing it does need to exist, and it remains an error for that not to be the case. For example, an "add" with a target location of "/a/b" starting with this document:

ただし、オブジェクト自体またはそれを含む配列は存在する必要があり、そうでない場合はエラーのままです。たとえば、次のドキュメントで始まる「/ a / b」のターゲットロケーションを持つ「add」:

   { "a": { "foo": 1 } }
        

is not an error, because "a" exists, and "b" will be added to its value. It is an error in this document:

「a」が存在し、その値に「b」が追加されるため、エラーではありません。このドキュメントのエラーです:

   { "q": { "bar": 2 } }
        

because "a" does not exist.

「a」が存在しないため。

4.2. remove
4.2. 削除する

The "remove" operation removes the value at the target location.

「削除」操作は、ターゲットの場所にある値を削除します。

The target location MUST exist for the operation to be successful.

操作が成功するには、ターゲットの場所が存在している必要があります。

For example:

例えば:

   { "op": "remove", "path": "/a/b/c" }
        

If removing an element from an array, any elements above the specified index are shifted one position to the left.

配列から要素を削除する場合、指定したインデックスより上の要素は、1つ左にシフトされます。

4.3. replace
4.3. 取り替える

The "replace" operation replaces the value at the target location with a new value. The operation object MUST contain a "value" member whose content specifies the replacement value.

「replace」操作は、ターゲットの場所の値を新しい値に置き換えます。操作オブジェクトには、その値が置換値を指定する「値」メンバーが含まれている必要があります。

The target location MUST exist for the operation to be successful.

操作が成功するには、ターゲットの場所が存在している必要があります。

For example:

例えば:

   { "op": "replace", "path": "/a/b/c", "value": 42 }
        

This operation is functionally identical to a "remove" operation for a value, followed immediately by an "add" operation at the same location with the replacement value.

この操作は、値の「削除」操作と機能的に同じですが、直後に、同じ場所で置換値を使用して「追加」操作を行います。

4.4. move
4.4. 動く

The "move" operation removes the value at a specified location and adds it to the target location.

「移動」操作は、指定された場所の値を削除し、それをターゲットの場所に追加します。

The operation object MUST contain a "from" member, which is a string containing a JSON Pointer value that references the location in the target document to move the value from.

操作オブジェクトには「from」メンバーを含める必要があります。これは、値を移動するターゲットドキュメント内の場所を参照するJSONポインター値を含む文字列です。

The "from" location MUST exist for the operation to be successful.

操作が成功するには、「from」の場所が存在している必要があります。

For example:

例えば:

   { "op": "move", "from": "/a/b/c", "path": "/a/b/d" }
        

This operation is functionally identical to a "remove" operation on the "from" location, followed immediately by an "add" operation at the target location with the value that was just removed.

この操作は、「from」の場所での「remove」操作と機能的に同じですが、直後に削除された値を使用して、ターゲットの場所で「add」操作が続きます。

The "from" location MUST NOT be a proper prefix of the "path" location; i.e., a location cannot be moved into one of its children.

「from」の場所は「path」の場所の適切なプレフィックスであってはなりません。つまり、場所をその子の1つに移動することはできません。

4.5. copy
4.5. 写す

The "copy" operation copies the value at a specified location to the target location.

「コピー」操作は、指定された場所にある値をターゲットの場所にコピーします。

The operation object MUST contain a "from" member, which is a string containing a JSON Pointer value that references the location in the target document to copy the value from.

操作オブジェクトには「from」メンバーを含める必要があります。これは、値をコピーするターゲットドキュメント内の場所を参照するJSONポインター値を含む文字列です。

The "from" location MUST exist for the operation to be successful.

操作が成功するには、「from」の場所が存在している必要があります。

For example:

例えば:

   { "op": "copy", "from": "/a/b/c", "path": "/a/b/e" }
        

This operation is functionally identical to an "add" operation at the target location using the value specified in the "from" member.

この操作は、「from」メンバーで指定された値を使用した、ターゲットの場所での「追加」操作と機能的に同じです。

4.6. test
4.6. テスト

The "test" operation tests that a value at the target location is equal to a specified value.

「テスト」操作は、ターゲットの場所の値が指定された値と等しいことをテストします。

The operation object MUST contain a "value" member that conveys the value to be compared to the target location's value.

操作オブジェクトには、ターゲットの場所の値と比較される値を伝達する「値」メンバーが含まれている必要があります。

The target location MUST be equal to the "value" value for the operation to be considered successful.

操作が成功したと見なされるには、ターゲットの場所が「値」の値と等しくなければなりません。

Here, "equal" means that the value at the target location and the value conveyed by "value" are of the same JSON type, and that they are considered equal by the following rules for that type:

ここで「等しい」とは、ターゲットの場所の値と「値」によって伝えられる値が同じJSONタイプであり、それらがそのタイプの次のルールによって等しいと見なされることを意味します。

o strings: are considered equal if they contain the same number of Unicode characters and their code points are byte-by-byte equal.

o 文字列:Unicode文字の数が同じで、コードポイントがバイトごとに等しい場合、それらは等しいと見なされます。

o numbers: are considered equal if their values are numerically equal.

o 数値:それらの値が数値的に等しい場合、等しいと見なされます。

o arrays: are considered equal if they contain the same number of values, and if each value can be considered equal to the value at the corresponding position in the other array, using this list of type-specific rules.

o 配列:同じ数の値が含まれている場合、および各タイプ固有のルールのこのリストを使用して、各値が他の配列の対応する位置の値と等しいと見なせる場合、等しいと見なされます。

o objects: are considered equal if they contain the same number of members, and if each member can be considered equal to a member in the other object, by comparing their keys (as strings) and their values (using this list of type-specific rules).

o オブジェクト:同じ数のメンバーが含まれている場合、および各メンバーが他のオブジェクトのメンバーと等しいと見なせる場合は、キー(文字列として)と値(このタイプ固有のルールのリストを使用)を比較することで等しいと見なされます)。

o literals (false, true, and null): are considered equal if they are the same.

o リテラル(false、true、null):それらが同じである場合、等しいと見なされます。

Note that the comparison that is done is a logical comparison; e.g., whitespace between the member values of an array is not significant.

行われる比較は論理的な比較であることに注意してください。たとえば、配列のメンバー値間の空白は重要ではありません。

Also, note that ordering of the serialization of object members is not significant.

また、オブジェクトメンバーのシリアル化の順序は重要ではありません。

For example:

例えば:

   { "op": "test", "path": "/a/b/c", "value": "foo" }
        
5. Error Handling
5. エラー処理

If a normative requirement is violated by a JSON Patch document, or if an operation is not successful, evaluation of the JSON Patch document SHOULD terminate and application of the entire patch document SHALL NOT be deemed successful.

JSONパッチドキュメントが規範的な要件に違反している場合、または操作が失敗した場合、JSONパッチドキュメントの評価は終了し(SHOULD)、パッチドキュメント全体の適用は成功したとは見なされません。

See [RFC5789], Section 2.2 for considerations regarding handling errors when JSON Patch is used with the HTTP PATCH method, including suggested status codes to use to indicate various conditions.

JSONパッチをHTTP PATCHメソッドで使用する場合のエラー処理に関する考慮事項については、[RFC5789]のセクション2.2を参照してください。さまざまな条件を示すために使用する推奨ステータスコードも含まれます。

Note that the HTTP PATCH method is atomic, as per [RFC5789]. Therefore, the following patch would result in no changes being made to the document at all (because the "test" operation results in an error):

[RFC5789]のように、HTTP PATCHメソッドはアトミックであることに注意してください。したがって、次のパッチでは、ドキュメントにまったく変更が加えられません( "test"操作はエラーになるため)。

   [
     { "op": "replace", "path": "/a/b/c", "value": 42 },
     { "op": "test", "path": "/a/b/c", "value": "C" }
   ]
        
6. IANA Considerations
6. IANAに関する考慮事項

The Internet media type for a JSON Patch document is application/ json-patch+json.

JSONパッチドキュメントのインターネットメディアタイプはapplication / json-patch + jsonです。

Type name: application

タイプ名:アプリケーション

Subtype name: json-patch+json

サブタイプ名:json-patch + json

Required parameters: none

必須パラメーター:なし

Optional parameters: none

オプションのパラメーター:なし

Encoding considerations: binary

エンコーディングに関する考慮事項:バイナリ

Security considerations: See Security Considerations in Section 7.

セキュリティに関する考慮事項:セクション7のセキュリティに関する考慮事項を参照してください。

Interoperability considerations: N/A

相互運用性に関する考慮事項:N / A

Published specification: RFC 6902

公開された仕様:RFC 6902

Applications that use this media type: Applications that manipulate JSON documents.

このメディアタイプを使用するアプリケーション:JSONドキュメントを操作するアプリケーション。

Additional information:

追加情報:

      Magic number(s):  N/A
        

File extension(s): .json-patch

ファイル拡張子:.json-patch

Macintosh file type code(s): TEXT

Macintoshファイルタイプコード:TEXT

   Person & email address to contact for further information:
      Paul C. Bryan <pbryan@anode.ca>
        

Intended usage: COMMON

使用目的:COMMON

Restrictions on usage: none

使用上の制限:なし

   Author:  Paul C. Bryan <pbryan@anode.ca>
        

Change controller: IETF

コントローラの変更:IETF

7. Security Considerations
7. セキュリティに関する考慮事項

This specification has the same security considerations as JSON [RFC4627] and JSON-Pointer [RFC6901].

この仕様には、JSON [RFC4627]およびJSON-Pointer [RFC6901]と同じセキュリティ上の考慮事項があります。

A few older Web browsers can be coerced into loading an arbitrary JSON document whose root is an array, leading to a situation in which a JSON Patch document containing sensitive information could be exposed to attackers, even if access is authenticated. This is known as a Cross-Site Request Forgery (CSRF) attack [CSRF].

いくつかの古いWebブラウザは、ルートが配列である任意のJSONドキュメントを強制的にロードすることができ、アクセスが認証されていても、機密情報を含むJSONパッチドキュメントが攻撃者に公開される可能性があります。これは、クロスサイトリクエストフォージェリ(CSRF)攻撃[CSRF]として知られています。

However, such browsers are not widely used (at the time of writing, it is estimated that they are used in less than 1% of the market). Publishers who are nevertheless concerned about this attack are advised to avoid making such documents available with HTTP GET.

ただし、そのようなブラウザは広く使用されていません(執筆時点では、市場の1%未満で使用されていると推定されています)。それでも、この攻撃を懸念している発行者は、そのようなドキュメントをHTTP GETで利用できるようにすることは避けてください。

8. Acknowledgements
8. 謝辞

The following individuals contributed ideas, feedback and wording to this specification:

以下の個人がこの仕様にアイデア、フィードバック、表現を提供しました:

Mike Acar, Mike Amundsen, Cyrus Daboo, Paul Davis, Stefan Koegl, Murray S. Kucherawy, Dean Landolt, Randall Leeds, James Manger, Julian Reschke, James Snell, Eli Stevens, and Henry S. Thompson.

Mike Acar、Mike Amundsen、Cyrus Daboo、Paul Davis、Stefan Koegl、Murray S. Kucherawy、Dean Landolt、Randall Leeds、James Manger、Julian Reschke、James Snell、Eli Stevens、およびHenry S. Thompson。

The structure of a JSON Patch document was influenced by the XML Patch document specification [RFC5261].

JSONパッチドキュメントの構造は、XMLパッチドキュメント仕様[RFC5261]の影響を受けました。

9. References
9. 参考文献
9.1. Normative References
9.1. 引用文献

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.

[RFC2119] Bradner、S。、「要件レベルを示すためにRFCで使用するキーワード」、BCP 14、RFC 2119、1997年3月。

[RFC4627] Crockford, D., "The application/json Media Type for JavaScript Object Notation (JSON)", RFC 4627, July 2006.

[RFC4627] Crockford、D。、「JavaScript Object Notation(JSON)のアプリケーション/ jsonメディアタイプ」、RFC 4627、2006年7月。

[RFC6901] Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed., "JavaScript Object Notation (JSON) Pointer", RFC 6901, April 2013.

[RFC6901]ブライアン、P。、編、Zyp、K。、およびM.ノッティンガム、編、「JavaScript Object Notation(JSON)ポインタ」、RFC 6901、2013年4月。

9.2. Informative References
9.2. 参考引用

[CSRF] Barth, A., Jackson, C., and J. Mitchell, "Robust Defenses for Cross-Site Request Forgery", ACM Conference on Computer and Communications Security, October 2008, <http://seclab.stanford.edu/websec/csrf/csrf.pdf>.

[CSRF]バース、A。、ジャクソン、C。、およびJ.ミッチェル、「クロスサイトリクエストフォージェリに対する堅牢な防御」、コンピュータと通信のセキュリティに関するACM会議、2008年10月、<http://seclab.stanford.edu /websec/csrf/csrf.pdf>。

[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.

[RFC2616] Fielding、R.、Gettys、J.、Mogul、J.、Frystyk、H.、Masinter、L.、Leach、P。、およびT. Berners-Lee、「Hypertext Transfer Protocol-HTTP / 1.1」 、RFC 2616、1999年6月。

[RFC5261] Urpalainen, J., "An Extensible Markup Language (XML) Patch Operations Framework Utilizing XML Path Language (XPath) Selectors", RFC 5261, September 2008.

[RFC5261] Urpalainen、J。、「XMLパス言語(XPath)セレクターを利用した拡張マークアップ言語(XML)パッチ操作フレームワーク」、RFC 5261、2008年9月。

[RFC5789] Dusseault, L. and J. Snell, "PATCH Method for HTTP", RFC 5789, March 2010.

[RFC5789] Dusseault、L.およびJ. Snell、「PATCH Method for HTTP」、RFC 5789、2010年3月。

Appendix A. Examples
付録A.例
A.1. Adding an Object Member
A.1. オブジェクトメンバーの追加

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": "bar"}
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/baz", "value": "qux" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   {
     "baz": "qux",
     "foo": "bar"
   }
        
A.2. Adding an Array Element
A.2. 配列要素の追加

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": [ "bar", "baz" ] }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/foo/1", "value": "qux" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   { "foo": [ "bar", "qux", "baz" ] }
        
A.3. Removing an Object Member
A.3. オブジェクトメンバーの削除

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "baz": "qux",
     "foo": "bar"
   }
   A JSON Patch document:
        
   [
     { "op": "remove", "path": "/baz" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   { "foo": "bar" }
        
A.4. Removing an Array Element
A.4. 配列要素の削除

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": [ "bar", "qux", "baz" ] }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "remove", "path": "/foo/1" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   { "foo": [ "bar", "baz" ] }
        
A.5. Replacing a Value
A.5. 値を置き換える

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "baz": "qux",
     "foo": "bar"
   }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "replace", "path": "/baz", "value": "boo" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   {
     "baz": "boo",
     "foo": "bar"
   }
        
A.6. Moving a Value
A.6. 値の移動

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "foo": {
       "bar": "baz",
       "waldo": "fred"
     },
     "qux": {
       "corge": "grault"
     }
   }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "move", "from": "/foo/waldo", "path": "/qux/thud" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   {
     "foo": {
       "bar": "baz"
     },
     "qux": {
       "corge": "grault",
       "thud": "fred"
     }
   }
        
A.7. Moving an Array Element
A.7. 配列要素の移動

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": [ "all", "grass", "cows", "eat" ] }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "move", "from": "/foo/1", "path": "/foo/3" }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   { "foo": [ "all", "cows", "eat", "grass" ] }
        
A.8. Testing a Value: Success
A.8. 価値のテスト:成功

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "baz": "qux",
     "foo": [ "a", 2, "c" ]
   }
        

A JSON Patch document that will result in successful evaluation:

評価に成功するJSONパッチドキュメント:

   [
     { "op": "test", "path": "/baz", "value": "qux" },
     { "op": "test", "path": "/foo/1", "value": 2 }
   ]
        
A.9. Testing a Value: Error
A.9. 値のテスト:エラー

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "baz": "qux" }
        

A JSON Patch document that will result in an error condition:

エラー状態になるJSONパッチドキュメント:

   [
     { "op": "test", "path": "/baz", "value": "bar" }
   ]
        
A.10. Adding a Nested Member Object
A.10. ネストされたメンバーオブジェクトの追加

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": "bar" }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/child", "value": { "grandchild": { } } }
   ]
   The resulting JSON document:
        
   {
     "foo": "bar",
     "child": {
       "grandchild": {
       }
     }
   }
        
A.11. Ignoring Unrecognized Elements
A.11. 認識されない要素を無視する

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": "bar" }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/baz", "value": "qux", "xyz": 123 }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   {
     "foo": "bar",
     "baz": "qux"
   }
        
A.12. Adding to a Nonexistent Target
A.12. 存在しないターゲットへの追加

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": "bar" }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/baz/bat", "value": "qux" }
   ]
        

This JSON Patch document, applied to the target JSON document above, would result in an error (therefore, it would not be applied), because the "add" operation's target location that references neither the root of the document, nor a member of an existing object, nor a member of an existing array.

上記のターゲットJSONドキュメントに適用されたこのJSONパッチドキュメントは、「追加」操作のターゲットの場所がドキュメントのルートもメンバーのメンバーも参照しないため、エラーになります(したがって、適用されません)。既存のオブジェクト、または既存の配列のメンバー。

A.13. Invalid JSON Patch Document
A.13. 無効なJSONパッチドキュメント

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/baz", "value": "qux", "op": "remove" }
   ]
        

This JSON Patch document cannot be treated as an "add" operation, because it contains a later "op":"remove" element. JSON requires that object member names be unique with a "SHOULD" requirement, and there is no standard error handling for duplicates.

このJSONパッチドキュメントは、後で「op」:「remove」要素が含まれているため、「追加」操作として処理できません。 JSONでは、オブジェクトメンバー名が「SHOULD」要件で一意である必要があり、重複の標準的なエラー処理はありません。

A.14. ~ Escape Ordering
A.14. 〜エスケープ注文

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "/": 9,
     "~1": 10
   }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     {"op": "test", "path": "/~01", "value": 10}
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   {
     "/": 9,
     "~1": 10
   }
        
A.15. Comparing Strings and Numbers
A.15. 文字列と数値の比較

An example target JSON document:

ターゲットJSONドキュメントの例:

   {
     "/": 9,
     "~1": 10
   }
   A JSON Patch document:
        
   [
     {"op": "test", "path": "/~01", "value": "10"}
   ]
        

This results in an error, because the test fails. The document value is numeric, whereas the value being tested for is a string.

テストが失敗するため、これはエラーになります。ドキュメントの値は数値ですが、テストされる値は文字列です。

A.16. Adding an Array Value
A.16. 配列値の追加

An example target JSON document:

ターゲットJSONドキュメントの例:

   { "foo": ["bar"] }
        

A JSON Patch document:

JSONパッチドキュメント:

   [
     { "op": "add", "path": "/foo/-", "value": ["abc", "def"] }
   ]
        

The resulting JSON document:

結果のJSONドキュメント:

   { "foo": ["bar", ["abc", "def"]] }
        

Authors' Addresses

著者のアドレス

Paul C. Bryan (editor) Salesforce.com

Paul C. Bryan(編集者)Salesforce.com

   Phone: +1 604 783 1481
   EMail: pbryan@anode.ca
        

Mark Nottingham (editor) Akamai

マーク・ノッティンガム(編集者)アカマイ

   EMail: mnot@mnot.net