Skip to content

Commit

Permalink
improved jsonpath support, for issue #532
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Jul 6, 2022
1 parent fd1c188 commit 8ebf302
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 3 deletions.
27 changes: 24 additions & 3 deletions core/src/main/java/com/alibaba/fastjson2/JSONPath.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -4168,6 +4182,8 @@ public void accept(Object value) {
}

return;
} else if (nameHashCode == HASH_STAR) {
values.add(value);
}
}
}
Expand Down Expand Up @@ -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();
Expand Down
29 changes: 29 additions & 0 deletions core/src/test/java/com/alibaba/fastjson2/issues/Issue532.java
Original file line number Diff line number Diff line change
@@ -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());
}
}

0 comments on commit 8ebf302

Please sign in to comment.