Skip to content

borgeby/clj-json-pointer

Repository files navigation

cljs-json-pointer

Clojars Project cljdoc build codecov

Simple Clojure(Script) library for working with JSON Pointer and JSON Patch, with no external dependencies. The JSON Patch function provided passes all the tests from the JSON patch conformance test suite.

Usage instructions

At the heart of the library is the ->vec function, which may be used to transform a JSON pointer into a vector representing the path of an object or array. This vector is suitable for use with the standard Clojure functions for nested access or updates, like get-in, assoc-in and update-in:

(ns app
  (:require [clj-json-pointer.core :as jp]))

(def org
  {"department"
   {"tech"
    {"users"
     [{"name" "ted"  "roles" ["developer"]}
      {"name" "jane" "roles" ["platform" "devops"]}]}
    "finance"
    {"users"
     [{"name" "joe"  "roles" ["reports-writer"]}]}}})

(let [path (jp/->vec org "/department/tech/users/1/roles") ; => ["department" "tech" 1 "users" "roles"]
      roles (get-in org path)]                             ; => ["platform" "devops"]
  (do (something (with roles))))

These simple building blocks are used to implement the various operations of JSON patch:

(jp/patch {}                                        ; => {}
  [{"op" "add" "path" "/foo" "value" "bar"}         ; => {"foo" "bar"}
   {"op" "add" "path" "/bar" "value" "baz"}         ; => {"foo" "bar" "bar" "baz}
   {"op" "remove" "path" "/foo"}                    ; => {"bar" "baz"}
   {"op" "replace" "path" "/bar" "value" "foo"}     ; => {"bar" "foo"}          
   {"op" "copy" "from" "/bar" "path" "/baz"}        ; => {"bar" "foo" "baz" "foo"}                
   {"op" "move" "from" "/baz" "path" "/foo"}        ; => {"foo" "foo"}
   {"op" "test" "path" "/foo" "value" "foo"}])      ; => {"foo" "foo"}

Or if you so prefer, use the apply-patch function, which applies a single patch to the provided data structure:

(jp/apply-patch {} {"op" "add" "path" "/a" "value" 1}) ; => {"a" 1}

; or, more likely:
(reduce jp/apply-patch {} patches)

Development

Test

  • clj -X:test to run the unit and compliance tests
  • shadow-cljs compile test && node target/cljs-test.js for ClojureScript

Deploy

  • clj -T:build jar
  • clj -X:deploy

About

Simple Clojure(Script) library for working with JSON Pointer and JSON Patch, with no external dependencies.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published