You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@johnzon.apache.org by "Jeffrey Hu (Jira)" <ji...@apache.org> on 2019/09/08 15:31:00 UTC

[jira] [Updated] (JOHNZON-274) Out-of-path values get removed when removing one with same name&level

     [ https://issues.apache.org/jira/browse/JOHNZON-274?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jeffrey Hu updated JOHNZON-274:
-------------------------------
    Description: 
Hi All,

I'm new to Apache and open-source projects in general. So please bear with me.

This one looks like a bug:

 
{code:java}
public class JsonPatchTest {
...
    @Test
    public void testReplacingObjectAttribute() {        JsonObject object = Json.createObjectBuilder()
                .add("foo", Json.createObjectBuilder()
                    .add("baz", new JsonStringImpl("1")))
                .add("bar", Json.createObjectBuilder()
                    .add("baz", new JsonStringImpl("2")))
                .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
                                                                             "/bar/baz",
                                                                             null,
                                                                             new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
        assertNotNull(patched);
        assertNotSame(object, patched);        JsonObject o = patched.getJsonObject("foo");
        assertNotNull(o);
        assertEquals(new JsonStringImpl("1"), o.getJsonString("baz"));
        o = patched.getJsonObject("bar");
        assertNotNull(o);
        assertEquals(new JsonStringImpl("3"), o.getJsonString("baz")); // fails here        assertEquals("{\"foo\":{\"baz\":\"1\"},\"bar\":{\"baz\":\"3\"}}", toJsonString(patched));
    }    @Test
    public void testReplacingArrayElementAttribute() {        JsonObject object = Json.createObjectBuilder()
                .add("foo", Json.createArrayBuilder()
                    .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("1")))
                    .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("2"))))
                                .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
                                                                             "/foo/1/bar",
                                                                             null,
                                                                             new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
        assertNotNull(patched);
        assertNotSame(object, patched);        JsonArray array = patched.getJsonArray("foo");
        assertNotNull(array);
        assertNotSame(object.getJsonArray("foo"), array);
        assertEquals(2, array.size());
        assertEquals(new JsonStringImpl("3"), array.getJsonObject(1).getJsonString("bar"));
        assertEquals(new JsonStringImpl("1"), array.getJsonObject(0).getJsonString("bar")); // fails here        assertEquals("{\"foo\":[{\"bar\":\"1\"},{\"bar\":\"3\"}]}", toJsonString(patched));
    }
...
}{code}
Basically I'm trying to do this:
{code:java}
{ "action": "replace", "path": "/bar/baz", "value": "3"}
{code}
to this:
{code:java}
{"foo":{"baz":"1"},"bar":{"baz":"2"}}
{code}
and I get
{code:java}
{"foo":{"baz":null},"bar":{"baz":"3"}}
{code}
 instead of 
{code:java}
{"foo":{"baz":"1"},"bar":{"baz":"3"}} 
{code}
  Similarly when I do
{code:java}
{ "action": "replace", "path": "/foo/1/bar", "value": "3"}
{code}
to this: 
{code:java}
{"foo":[{"bar":"1"},{"bar":"2"}]}
{code}
and I get
{code:java}
{"foo":[{"bar":null},{"bar":"3"}]}
{code}
 instead of 
{code:java}
{"foo":[{"bar":"1"},{"bar":"3"}]}
{code}
 

The problem seems [to be in|https://github.com/stohu/johnzon/commit/515d363b8c55f0ba0835bda18f58dd545c0eb637] the removing method in JsonPointerImpl. The enclosed patch passed all the tests.

 (based on commit  515d363b8c55f0ba0835bda18f58dd545c0eb637 on master)

  was:
Hi All,

I'm new to Apache and open-source projects in general. So please bear with me.

This one looks like a bug:

 
{code:java}
public class JsonPatchTest {
...
    @Test
    public void testReplacingObjectAttribute() {        JsonObject object = Json.createObjectBuilder()
                .add("foo", Json.createObjectBuilder()
                    .add("baz", new JsonStringImpl("1")))
                .add("bar", Json.createObjectBuilder()
                    .add("baz", new JsonStringImpl("2")))
                .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
                                                                             "/bar/baz",
                                                                             null,
                                                                             new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
        assertNotNull(patched);
        assertNotSame(object, patched);        JsonObject o = patched.getJsonObject("foo");
        assertNotNull(o);
        assertEquals(new JsonStringImpl("1"), o.getJsonString("baz"));
        o = patched.getJsonObject("bar");
        assertNotNull(o);
        assertEquals(new JsonStringImpl("3"), o.getJsonString("baz")); // fails here        assertEquals("{\"foo\":{\"baz\":\"1\"},\"bar\":{\"baz\":\"3\"}}", toJsonString(patched));
    }    @Test
    public void testReplacingArrayElementAttribute() {        JsonObject object = Json.createObjectBuilder()
                .add("foo", Json.createArrayBuilder()
                    .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("1")))
                    .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("2"))))
                                .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
                                                                             "/foo/1/bar",
                                                                             null,
                                                                             new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
        assertNotNull(patched);
        assertNotSame(object, patched);        JsonArray array = patched.getJsonArray("foo");
        assertNotNull(array);
        assertNotSame(object.getJsonArray("foo"), array);
        assertEquals(2, array.size());
        assertEquals(new JsonStringImpl("3"), array.getJsonObject(1).getJsonString("bar"));
        assertEquals(new JsonStringImpl("1"), array.getJsonObject(0).getJsonString("bar")); // fails here        assertEquals("{\"foo\":[{\"bar\":\"1\"},{\"bar\":\"3\"}]}", toJsonString(patched));
    }
...
}{code}
Basically I'm trying to do this:

 

 
{code:java}
{ "action": "replace", "path": "/bar/baz", "value": "3"}
{code}
to this:

 

 
{code:java}
{"foo":{"baz":"1"},"bar":{"baz":"2"}}
{code}
and I get
{code:java}
{"foo":{"baz":null},"bar":{"baz":"3"}}
{code}
 

instead of 
{code:java}
{"foo":{"baz":"1"},"bar":{"baz":"3"}} 
{code}
 

 Similarly when I do
{code:java}
{ "action": "replace", "path": "/foo/1/bar", "value": "3"}
{code}
to this: 
{code:java}
{"foo":[{"bar":"1"},{"bar":"2"}]}
{code}
and I get
{code:java}
{"foo":[{"bar":null},{"bar":"3"}]}
{code}
 instead of 
{code:java}
{"foo":[{"bar":"1"},{"bar":"3"}]}
{code}
 

The problem seems [to be in|https://github.com/stohu/johnzon/commit/515d363b8c55f0ba0835bda18f58dd545c0eb637] the removing method in JsonPointerImpl. The enclosed patch passed all the tests.

 

(based on commit  515d363b8c55f0ba0835bda18f58dd545c0eb637 on master)


> Out-of-path values get removed when removing one with same name&level
> ---------------------------------------------------------------------
>
>                 Key: JOHNZON-274
>                 URL: https://issues.apache.org/jira/browse/JOHNZON-274
>             Project: Johnzon
>          Issue Type: Bug
>            Reporter: Jeffrey Hu
>            Priority: Major
>         Attachments: 0001-fix-when-JsonPatch-removing-JsonObjects-not-on-the-p.patch
>
>
> Hi All,
> I'm new to Apache and open-source projects in general. So please bear with me.
> This one looks like a bug:
>  
> {code:java}
> public class JsonPatchTest {
> ...
>     @Test
>     public void testReplacingObjectAttribute() {        JsonObject object = Json.createObjectBuilder()
>                 .add("foo", Json.createObjectBuilder()
>                     .add("baz", new JsonStringImpl("1")))
>                 .add("bar", Json.createObjectBuilder()
>                     .add("baz", new JsonStringImpl("2")))
>                 .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
>                                                                              "/bar/baz",
>                                                                              null,
>                                                                              new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
>         assertNotNull(patched);
>         assertNotSame(object, patched);        JsonObject o = patched.getJsonObject("foo");
>         assertNotNull(o);
>         assertEquals(new JsonStringImpl("1"), o.getJsonString("baz"));
>         o = patched.getJsonObject("bar");
>         assertNotNull(o);
>         assertEquals(new JsonStringImpl("3"), o.getJsonString("baz")); // fails here        assertEquals("{\"foo\":{\"baz\":\"1\"},\"bar\":{\"baz\":\"3\"}}", toJsonString(patched));
>     }    @Test
>     public void testReplacingArrayElementAttribute() {        JsonObject object = Json.createObjectBuilder()
>                 .add("foo", Json.createArrayBuilder()
>                     .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("1")))
>                     .add(Json.createObjectBuilder().add("bar", new JsonStringImpl("2"))))
>                                 .build();        JsonPatchImpl patch = new JsonPatchImpl(PROVIDER, new JsonPatchImpl.PatchValue(PROVIDER, JsonPatch.Operation.REPLACE,
>                                                                              "/foo/1/bar",
>                                                                              null,
>                                                                              new JsonStringImpl("3")));        JsonObject patched = patch.apply(object);
>         assertNotNull(patched);
>         assertNotSame(object, patched);        JsonArray array = patched.getJsonArray("foo");
>         assertNotNull(array);
>         assertNotSame(object.getJsonArray("foo"), array);
>         assertEquals(2, array.size());
>         assertEquals(new JsonStringImpl("3"), array.getJsonObject(1).getJsonString("bar"));
>         assertEquals(new JsonStringImpl("1"), array.getJsonObject(0).getJsonString("bar")); // fails here        assertEquals("{\"foo\":[{\"bar\":\"1\"},{\"bar\":\"3\"}]}", toJsonString(patched));
>     }
> ...
> }{code}
> Basically I'm trying to do this:
> {code:java}
> { "action": "replace", "path": "/bar/baz", "value": "3"}
> {code}
> to this:
> {code:java}
> {"foo":{"baz":"1"},"bar":{"baz":"2"}}
> {code}
> and I get
> {code:java}
> {"foo":{"baz":null},"bar":{"baz":"3"}}
> {code}
>  instead of 
> {code:java}
> {"foo":{"baz":"1"},"bar":{"baz":"3"}} 
> {code}
>   Similarly when I do
> {code:java}
> { "action": "replace", "path": "/foo/1/bar", "value": "3"}
> {code}
> to this: 
> {code:java}
> {"foo":[{"bar":"1"},{"bar":"2"}]}
> {code}
> and I get
> {code:java}
> {"foo":[{"bar":null},{"bar":"3"}]}
> {code}
>  instead of 
> {code:java}
> {"foo":[{"bar":"1"},{"bar":"3"}]}
> {code}
>  
> The problem seems [to be in|https://github.com/stohu/johnzon/commit/515d363b8c55f0ba0835bda18f58dd545c0eb637] the removing method in JsonPointerImpl. The enclosed patch passed all the tests.
>  (based on commit  515d363b8c55f0ba0835bda18f58dd545c0eb637 on master)



--
This message was sent by Atlassian Jira
(v8.3.2#803003)