@@ -119,11 +119,11 @@ func MergePatch(docData, patchData []byte) ([]byte, error) {
119119func doMergePatch (docData , patchData []byte , mergeMerge bool ) ([]byte , error ) {
120120doc := & partialDoc {}
121121
122- docErr := json . Unmarshal (docData , doc )
122+ docErr := unmarshal (docData , doc )
123123
124124patch := & partialDoc {}
125125
126- patchErr := json . Unmarshal (patchData , patch )
126+ patchErr := unmarshal (patchData , patch )
127127
128128if isSyntaxError (docErr ) {
129129return nil , errBadJSONDoc
@@ -151,7 +151,7 @@ func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) {
151151}
152152} else {
153153patchAry := & partialArray {}
154- patchErr = json . Unmarshal (patchData , patchAry )
154+ patchErr = unmarshal (patchData , patchAry )
155155
156156if patchErr != nil {
157157return nil , errBadJSONPatch
@@ -227,12 +227,12 @@ func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
227227originalDoc := map [string ]interface {}{}
228228modifiedDoc := map [string ]interface {}{}
229229
230- err := json . Unmarshal (originalJSON , & originalDoc )
230+ err := unmarshal (originalJSON , & originalDoc )
231231if err != nil {
232232return nil , errBadJSONDoc
233233}
234234
235- err = json . Unmarshal (modifiedJSON , & modifiedDoc )
235+ err = unmarshal (modifiedJSON , & modifiedDoc )
236236if err != nil {
237237return nil , errBadJSONDoc
238238}
@@ -245,6 +245,12 @@ func createObjectMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
245245return json .Marshal (dest )
246246}
247247
248+ func unmarshal (data []byte , into interface {}) error {
249+ dec := json .NewDecoder (bytes .NewReader (data ))
250+ dec .UseNumber ()
251+ return dec .Decode (into )
252+ }
253+
248254// createArrayMergePatch will return an array of merge-patch documents capable
249255// of converting the original document to the modified document for each
250256// pair of JSON documents provided in the arrays.
@@ -253,12 +259,12 @@ func createArrayMergePatch(originalJSON, modifiedJSON []byte) ([]byte, error) {
253259originalDocs := []json.RawMessage {}
254260modifiedDocs := []json.RawMessage {}
255261
256- err := json . Unmarshal (originalJSON , & originalDocs )
262+ err := unmarshal (originalJSON , & originalDocs )
257263if err != nil {
258264return nil , errBadJSONDoc
259265}
260266
261- err = json . Unmarshal (modifiedJSON , & modifiedDocs )
267+ err = unmarshal (modifiedJSON , & modifiedDocs )
262268if err != nil {
263269return nil , errBadJSONDoc
264270}
@@ -314,6 +320,11 @@ func matchesValue(av, bv interface{}) bool {
314320if bt == at {
315321return true
316322}
323+ case json.Number :
324+ bt := bv .(json.Number )
325+ if bt == at {
326+ return true
327+ }
317328case float64 :
318329bt := bv .(float64 )
319330if bt == at {
@@ -377,7 +388,7 @@ func getDiff(a, b map[string]interface{}) (map[string]interface{}, error) {
377388if len (dst ) > 0 {
378389into [key ] = dst
379390}
380- case string , float64 , bool :
391+ case string , float64 , bool , json. Number :
381392if ! matchesValue (av , bv ) {
382393into [key ] = bv
383394}
0 commit comments