2013-04-10 3 views
3

J'ai une question à propos de l'interprétation de JSON Patch (RFC 6902).interprétation du patch JSON spec

Supposons que j'avais une ressource qui ressemblait à ceci:

{ 
    "type": "assembly", 
    "uri": "http://example.com/campSrv/Assembly/18", 
    "name": "/sample", 
    "description": "Hello, World Application", 
    "created": "2013-03-27T16:15Z", 
    ... 
} 

La définition de cette ressource dit qu'il pourrait avoir une valeur appelée « balises » qui est défini comme étant un tableau de chaînes. Toutefois, cette ressource n'a actuellement pas de balises, donc mon service ne sérialise pas le tableau inexistant.

Supposons maintenant que je soumets la demande HTTP PATCH suivante:

PATCH http://example.com/campSrv/Assembly/18 HTTP/1.1 
Content-Type: application/json-patch 

[ 
    { "op": "add", "path": "/tags/0", "value": "flobbit" } 
] 

Si cela créer le tableau « tags » et ajoutez « flobbit » en tant que premier élément/ou que mon serveur doit retourner une erreur?

Répondre

2

Dans ma compréhension ...

Votre patch entraînera une erreur, car tags n'existe pas, et vous ne pouvez pas ajouter à un tableau qui n'existe pas encore.

RFC 6902 4.1

...

Cependant, l'objet lui-même ou un tableau contenant ne doivent
existe, et il reste une erreur pour que ne pas être le cas. Pour
exemple, un "ajouter" avec un emplacement cible "/ a/b" à partir de ce document :

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

est pas un erreur, car "a" existe, et "b" sera ajouté à sa valeur
. Il est une erreur dans ce document:

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

parce que "un" n'existe pas.

Ce correctif ajoutera cependant une chaîne tags avec une valeur de "flobbit".

[ 
    { "op": "add", "path": "/tags", "value": "flobbit" } 
] 

Et ce patch ajoutera tableau tags avec le premier élément étant "fobbit".

[ 
    { "op": "add", "path": "/tags", "value": ["flobbit"] } 
] 
+0

'{ "op": "ajouter", "chemin": "/ tags", "valeur": [ "flobbit"]}' Dans le cas ci-dessus, qu'en est si le tableau de balises existe déjà, si un ajouter "flobbit" ou remplacer le tableau entier par le contenu du tableau fourni? (Versus en utilisant op "replace" qui devrait rejeter la requête si le tableau de tags n'existe pas). (Si vous vous sentez le plus naturel pour remplacer la totalité de la matrice, si vous souhaitez ajouter plusieurs valeurs, utilisez plusieurs opérations) – GreenMoose

+0

Je ne suis pas sûr de la tête. Mais, interpréter cela comme signifier, "ajouter un tableau contenant un seul élément" flobbit "au tableau existant." Ainsi, la propriété 'tags' mise à jour ressemblera à quelque chose comme' ["valeur existante", "valeur existante2", "etc.", ["flobbit"]] '. – svidgen

+0

@svidgen Je crois que c'est incorrect.RFC6902 spécifie ceci pour l'opération 'ajouter': "Si l'emplacement cible spécifie un membre d'objet qui existe, la valeur de ce membre est remplacée." - Il montre ensuite comment ajouter quelque chose à un tableau existant: "Un élément à ajouter à un tableau existant [...] Si le caractère" - "est utilisé pour indexer la fin du tableau (voir [RFC6901])), ceci a pour effet d'ajouter la valeur au tableau " Donc le patch devrait ressembler à {" op ":" ajouter "," chemin ":"/tags/- "," value ":" flobbit "} vous voulez ajouter l'élément "flobbit" au tableau existant. –