diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONPath.java b/core/src/main/java/com/alibaba/fastjson2/JSONPath.java index 35ef1d7662..8175c67aaa 100644 --- a/core/src/main/java/com/alibaba/fastjson2/JSONPath.java +++ b/core/src/main/java/com/alibaba/fastjson2/JSONPath.java @@ -621,6 +621,17 @@ public boolean apply(Object fieldValue) { cmp = ((Double) fieldValue) .compareTo( Double.valueOf(value)); + } else if (fieldValue instanceof String) { + String fieldValueStr = (String) fieldValue; + if (IOUtils.isNumber(fieldValueStr)) { + try { + cmp = Long.valueOf(Long.parseLong(fieldValueStr)).compareTo(Long.valueOf(value)); + } catch (Exception ignored) { + cmp = fieldValueStr.compareTo(Long.toString(value)); + } + } else { + cmp = fieldValueStr.compareTo(Long.toString(value)); + } } else { throw new UnsupportedOperationException(); } @@ -4043,6 +4054,7 @@ public String toString() { static final class CycleNameSegment extends Segment { + static final long HASH_STAR = Fnv.hashCode64("*"); final String name; final long nameHashCode; @@ -4134,6 +4146,8 @@ public void accept(Object key, Object value) { ((Map) value).forEach(this); } else if (value instanceof List) { ((List) value).forEach(this); + } else if (nameHashCode == HASH_STAR) { + values.add(value); } } @@ -4168,6 +4182,8 @@ public void accept(Object value) { } return; + } else if (nameHashCode == HASH_STAR) { + values.add(value); } } } @@ -6156,9 +6172,14 @@ private Segment parseProperty() { segment = AllSegment.INSTANCE; } else if (jsonReader.ch == '.') { jsonReader.next(); - long hashCode = jsonReader.readFieldNameHashCodeUnquote(); - String name = jsonReader.getFieldName(); - segment = new CycleNameSegment(name, hashCode); + if (jsonReader.ch == '*') { + jsonReader.next(); + segment = new CycleNameSegment("*", Fnv.hashCode64("*")); + } else { + long hashCode = jsonReader.readFieldNameHashCodeUnquote(); + String name = jsonReader.getFieldName(); + segment = new CycleNameSegment(name, hashCode); + } } else { boolean isNum = jsonReader.isNumber(); long hashCode = jsonReader.readFieldNameHashCodeUnquote(); diff --git a/core/src/test/java/com/alibaba/fastjson2/issues/Issue532.java b/core/src/test/java/com/alibaba/fastjson2/issues/Issue532.java new file mode 100644 index 0000000000..d9554798fd --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues/Issue532.java @@ -0,0 +1,29 @@ +package com.alibaba.fastjson2.issues; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONPath; +import com.alibaba.fastjson2.JSONReader; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class Issue532 { + JSONObject object; + + @BeforeEach + public void init() { + String str = "{code:1,msg:'Hello world',data:{list:[1,2,3,4,5], ary2:[{a:2},{a:3,b:{c:'ddd'}}]}}"; + object = JSON.parseObject(str, JSONReader.Feature.AllowUnQuotedFieldNames); + } + + @Test + public void test() { + assertNull(JSONPath.eval(object, "$[?(@.c =~ /a+/)]")); + assertEquals("ddd", JSONPath.eval(object, "$..c.min()")); + assertEquals("[]", JSONPath.eval(object, "$..b[?(@.c == 12)]").toString()); + assertEquals("[1,\"Hello world\",1,2,3,4,5,2,3,\"ddd\"]", JSONPath.eval(object, "$..*").toString()); + } +}