From 982cfcd9225268f6b4827fa7c56a8e84873fe8b4 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Fri, 17 Jun 2022 04:11:39 +0800 Subject: [PATCH] bug fix for two segment JSONPath set error, for issue #476 --- .../java/com/alibaba/fastjson2/JSONPath.java | 16 +++++++++++++++- .../com/alibaba/fastjson2/issues/Issue476.java | 17 +++++++++++++++++ .../alibaba/fastjson2/jsonpath/JSONPath_18.java | 7 +++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/com/alibaba/fastjson2/issues/Issue476.java diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONPath.java b/core/src/main/java/com/alibaba/fastjson2/JSONPath.java index 9714c7179c..a95f73040a 100644 --- a/core/src/main/java/com/alibaba/fastjson2/JSONPath.java +++ b/core/src/main/java/com/alibaba/fastjson2/JSONPath.java @@ -2936,7 +2936,21 @@ public void set(Object root, Object value) { context0.root = root; first.eval(context0); if (context0.value == null) { - return; + Object emptyValue; + if (second instanceof IndexSegment) { + emptyValue = new JSONArray(); + } else if (second instanceof NameSegment) { + emptyValue = new JSONObject(); + } else { + return; + } + + context0.value = emptyValue; + if (root instanceof Map && first instanceof NameSegment) { + ((Map) root).put(((NameSegment) first).name, emptyValue); + } else if (root instanceof List && first instanceof IndexSegment) { + ((List) root).set(((IndexSegment) first).index, emptyValue); + } } Context context1 = new Context(this, context0, second, null, 0); diff --git a/core/src/test/java/com/alibaba/fastjson2/issues/Issue476.java b/core/src/test/java/com/alibaba/fastjson2/issues/Issue476.java new file mode 100644 index 0000000000..f0f8c5d6d7 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues/Issue476.java @@ -0,0 +1,17 @@ +package com.alibaba.fastjson2.issues; + +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONPath; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class Issue476 { + @Test + public void test() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("c", "c"); + JSONPath.set(jsonObject, "$.a.b", "123"); + assertEquals("{\"c\":\"c\",\"a\":{\"b\":\"123\"}}", jsonObject.toJSONString()); + } +} diff --git a/core/src/test/java/com/alibaba/fastjson2/jsonpath/JSONPath_18.java b/core/src/test/java/com/alibaba/fastjson2/jsonpath/JSONPath_18.java index c565fea16a..aa1e63e57b 100644 --- a/core/src/test/java/com/alibaba/fastjson2/jsonpath/JSONPath_18.java +++ b/core/src/test/java/com/alibaba/fastjson2/jsonpath/JSONPath_18.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; public class JSONPath_18 { String str = "{ \"inputs\": {\n" + @@ -48,4 +49,10 @@ public void test1() { .toString() ); } + + @Test + public void test2() { + Object object = new Object(); + assertSame(object, JSONPath.of("$").eval(object)); + } }