Skip to content

Commit 8f818ef

Browse files
committed
initial commit / release
0 parents  commit 8f818ef

4 files changed

Lines changed: 126 additions & 0 deletions

File tree

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# JSON Pointer for nodejs
2+
3+
This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00).
4+
5+
## Usage
6+
7+
var jsonpointer = require("jsonpointer");
8+
var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};
9+
var one = jsonpointer.get(obj, "/foo");
10+
var two = jsonpointer.get(obj, "/bar/baz");
11+
var three = jsonpointer.get(obj, "/qux/0");
12+
var four = jsonpointer.get(obj, "/qux/1");
13+
var five = jsonpointer.get(obj, "/qux/2");
14+
15+
jsonpointer.set(obj, "/foo", 6); // obj.foo = 6;
16+
17+
## Testing
18+
19+
$ node test.js
20+
All tests pass.
21+
$
22+
23+
## Author
24+
25+
(c) 2011 Jan Lehnardt <jan@apache.org>
26+
27+
## License
28+
29+
MIT License.

jsonpointer.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
var console = require("console");
2+
3+
var traverse = function(obj, pointer, value) {
4+
// assert(isArray(pointer))
5+
var part = pointer.shift();
6+
if(typeof obj[part] !== "undefined") {
7+
if(pointer.length == 0) { // we're done
8+
if(typeof value !== "undefined") { // set new value, return old value
9+
var old_value = obj[part];
10+
if(value === null) {
11+
delete obj[part];
12+
} else {
13+
obj[part] = value;
14+
}
15+
return old_value;
16+
} else { // just reading
17+
return obj[part];
18+
}
19+
} else { // keep traversin!
20+
return traverse(obj[part], pointer);
21+
}
22+
} else {
23+
throw("Value for pointer '" + pointer + "' not found.");
24+
}
25+
}
26+
27+
var validate_input = function(obj, pointer) {
28+
if(typeof obj !== "object") {
29+
throw("Invalid input object.");
30+
}
31+
32+
if(!pointer) {
33+
throw("Invalid JSON pointer.");
34+
}
35+
}
36+
37+
var get = function(obj, pointer) {
38+
validate_input(obj, pointer);
39+
pointer = pointer.split("/").slice(1);
40+
return traverse(obj, pointer);
41+
}
42+
43+
var set = function(obj, pointer, value) {
44+
validate_input(obj, pointer);
45+
pointer = pointer.split("/").slice(1);
46+
return traverse(obj, pointer);
47+
}
48+
49+
exports.get = get
50+
exports.set = set

package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{ "name" : "jsonpointer"
2+
, "description" : "Simple JSON Addressing."
3+
, "tags" : ["util", "simple", "util", "utility"]
4+
, "version" : "1.0.0"
5+
, "author" : "Jan Lehnardt <jan@apache.org>"
6+
, "repository" :
7+
{ "type" : "git"
8+
, "url" : "http://github.com/janl/node-jsonpointer.git"
9+
}
10+
, "bugs" :
11+
{ "web" : "http://github.com/janl/node-jsonpointer/issues" }
12+
, "engines" : ["node >= 0.4.9"]
13+
, "main" : "./jsonpointer"
14+
}

test.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
var assert = require("assert");
2+
var console = require("console");
3+
var jsonpointer = require("./jsonpointer");
4+
5+
var obj = {
6+
a: 1,
7+
b: {
8+
c: 2
9+
},
10+
d: {
11+
e: [{a:3}, {b:4}, {c:5}]
12+
}
13+
};
14+
15+
assert.equal(jsonpointer.get(obj, "/a"), 1);
16+
assert.equal(jsonpointer.get(obj, "/b/c"), 2);
17+
assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 3);
18+
assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 4);
19+
assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 5);
20+
21+
assert.equal(jsonpointer.set(obj, "/a"), 1);
22+
assert.equal(jsonpointer.set(obj, "/b/c"), 2);
23+
assert.equal(jsonpointer.set(obj, "/d/e/0/a"), 3);
24+
assert.equal(jsonpointer.set(obj, "/d/e/1/b"), 4);
25+
assert.equal(jsonpointer.set(obj, "/d/e/2/c"), 5);
26+
27+
assert.equal(jsonpointer.get(obj, "/a"), 1);
28+
assert.equal(jsonpointer.get(obj, "/b/c"), 2);
29+
assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 3);
30+
assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 4);
31+
assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 5);
32+
33+
console.log("All tests pass.");

0 commit comments

Comments
 (0)