Skip to content

Commit

Permalink
fix duplicated list for issue #2134
Browse files Browse the repository at this point in the history
  • Loading branch information
yanxutao89 authored and wenshao committed Jan 2, 2024
1 parent 67e1e74 commit 4918708
Show file tree
Hide file tree
Showing 3 changed files with 201 additions and 1 deletion.
18 changes: 17 additions & 1 deletion core/src/main/java/com/alibaba/fastjson2/JSONPathMulti.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ final class JSONPathMulti

boolean extractSupport = true;
boolean ref = true;
for (JSONPathSegment segment : segments) {
int size = segments.size();
for (int i = 0; i < size - 1; i++) {
JSONPathSegment segment = segments.get(i);
if (segment instanceof JSONPathSegmentIndex) {
if (((JSONPathSegmentIndex) segment).index < 0) {
extractSupport = false;
Expand All @@ -31,6 +33,13 @@ final class JSONPathMulti
continue;
}
ref = false;
if (i > 0) {
JSONPathSegment prev = segments.get(i - 1);
if (prev instanceof JSONPathSegment.CycleNameSegment && ((JSONPathSegment.CycleNameSegment) prev).shouldRecursive()
&& segment instanceof JSONPathFilter.NameFilter) {
((JSONPathFilter.NameFilter) segment).excludeArray();
}
}
break;
}
this.extractSupport = extractSupport;
Expand Down Expand Up @@ -172,6 +181,13 @@ public Object eval(Object root) {
context.root = root;
}

if (i > 0) {
JSONPathSegment prev = segments.get(i - 1);
if (prev instanceof JSONPathSegment.CycleNameSegment && ((JSONPathSegment.CycleNameSegment) prev).shouldRecursive()
&& segment instanceof JSONPathFilter.NameFilter) {
((JSONPathFilter.NameFilter) segment).excludeArray();
}
}
segment.eval(context);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ public Object eval(Object root) {
return null;
}

if (first instanceof JSONPathSegment.CycleNameSegment && ((JSONPathSegment.CycleNameSegment) first).shouldRecursive()
&& second instanceof JSONPathFilter.NameFilter) {
((JSONPathFilter.NameFilter) second).excludeArray();
}

Context context1 = new Context(this, context0, second, null, 0);
second.eval(context1);
Object contextValue = context1.value;
Expand Down
179 changes: 179 additions & 0 deletions core/src/test/java/com/alibaba/fastjson2/issues_2100/Issue2134.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
package com.alibaba.fastjson2.issues_2100;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONPath;
import com.alibaba.fastjson2.JSONWriter;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue2134 {
@Test
public void test() {
String json = "{\n" +
"\t\"BidNode\":[\n" +
"\t\t{\n" +
"\t\t\t\"ID\":1,\n" +
"\t\t\t\"Code\":\"1\",\n" +
"\t\t\t\"Description\":\"土建工程\",\n" +
"\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\"TradeName\":\"土建工程\",\n" +
"\t\t\t\"type\":\"zy\",\n" +
"\t\t\t\"Amount\":80,\n" +
"\t\t\t\"AmountIncludeTax\":87.2,\n" +
"\t\t\t\"BuildingArea\":6,\n" +
"\t\t\t\"ExistLY\":false,\n" +
"\t\t\t\"IsMainMajor\":true,\n" +
"\t\t\t\"Children\":[\n" +
"\t\t\t\t{\n" +
"\t\t\t\t\t\"ID\":2,\n" +
"\t\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\t\"Code\":\"1.1\",\n" +
"\t\t\t\t\t\"Description\":\"多层住宅(≤7F)3\",\n" +
"\t\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\t\"Amount\":8,\n" +
"\t\t\t\t\t\"AmountIncludeTax\":8.72,\n" +
"\t\t\t\t\t\"BuildingArea\":4,\n" +
"\t\t\t\t\t\"ExistLY\":true,\n" +
"\t\t\t\t\t\"ProjectCategoryCode\":\"001001001\",\n" +
"\t\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t\t},\n" +
"\t\t\t\t{\n" +
"\t\t\t\t\t\"ID\":3,\n" +
"\t\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\t\"Code\":\"1.2\",\n" +
"\t\t\t\t\t\"Description\":\"中高层住宅(≤18F)\",\n" +
"\t\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\t\"Amount\":36,\n" +
"\t\t\t\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\t\t\t\"BuildingArea\":6,\n" +
"\t\t\t\t\t\"ExistLY\":true,\n" +
"\t\t\t\t\t\"ProjectCategoryCode\":\"001001002\",\n" +
"\t\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t\t},\n" +
"\t\t\t\t{\n" +
"\t\t\t\t\t\"ID\":4,\n" +
"\t\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\t\"Code\":\"1.3\",\n" +
"\t\t\t\t\t\"Description\":\"高层住宅(≤43F)\",\n" +
"\t\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\t\"Amount\":36,\n" +
"\t\t\t\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\t\t\t\"BuildingArea\":0,\n" +
"\t\t\t\t\t\"ExistLY\":false,\n" +
"\t\t\t\t\t\"ProjectCategoryCode\":\"001001003\",\n" +
"\t\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t\t}\n" +
"\t\t\t]\n" +
"\t\t}\n" +
"\t]\n" +
"}";
String expect = "[\n" +
"\t{\n" +
"\t\t\"ID\":1,\n" +
"\t\t\"Code\":\"1\",\n" +
"\t\t\"Description\":\"土建工程\",\n" +
"\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\"TradeName\":\"土建工程\",\n" +
"\t\t\"type\":\"zy\",\n" +
"\t\t\"Amount\":80,\n" +
"\t\t\"AmountIncludeTax\":87.2,\n" +
"\t\t\"BuildingArea\":6,\n" +
"\t\t\"ExistLY\":false,\n" +
"\t\t\"IsMainMajor\":true,\n" +
"\t\t\"Children\":[\n" +
"\t\t\t{\n" +
"\t\t\t\t\"ID\":2,\n" +
"\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\"Code\":\"1.1\",\n" +
"\t\t\t\t\"Description\":\"多层住宅(≤7F)3\",\n" +
"\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\"Amount\":8,\n" +
"\t\t\t\t\"AmountIncludeTax\":8.72,\n" +
"\t\t\t\t\"BuildingArea\":4,\n" +
"\t\t\t\t\"ExistLY\":true,\n" +
"\t\t\t\t\"ProjectCategoryCode\":\"001001001\",\n" +
"\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"ID\":3,\n" +
"\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\"Code\":\"1.2\",\n" +
"\t\t\t\t\"Description\":\"中高层住宅(≤18F)\",\n" +
"\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\"Amount\":36,\n" +
"\t\t\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\t\t\"BuildingArea\":6,\n" +
"\t\t\t\t\"ExistLY\":true,\n" +
"\t\t\t\t\"ProjectCategoryCode\":\"001001002\",\n" +
"\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t},\n" +
"\t\t\t{\n" +
"\t\t\t\t\"ID\":4,\n" +
"\t\t\t\t\"PID\":1,\n" +
"\t\t\t\t\"Code\":\"1.3\",\n" +
"\t\t\t\t\"Description\":\"高层住宅(≤43F)\",\n" +
"\t\t\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\t\t\"type\":\"yt\",\n" +
"\t\t\t\t\"Amount\":36,\n" +
"\t\t\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\t\t\"BuildingArea\":0,\n" +
"\t\t\t\t\"ExistLY\":false,\n" +
"\t\t\t\t\"ProjectCategoryCode\":\"001001003\",\n" +
"\t\t\t\t\"IsMainMajor\":true\n" +
"\t\t\t}\n" +
"\t\t]\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"ID\":2,\n" +
"\t\t\"PID\":1,\n" +
"\t\t\"Code\":\"1.1\",\n" +
"\t\t\"Description\":\"多层住宅(≤7F)3\",\n" +
"\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\"type\":\"yt\",\n" +
"\t\t\"Amount\":8,\n" +
"\t\t\"AmountIncludeTax\":8.72,\n" +
"\t\t\"BuildingArea\":4,\n" +
"\t\t\"ExistLY\":true,\n" +
"\t\t\"ProjectCategoryCode\":\"001001001\",\n" +
"\t\t\"IsMainMajor\":true\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"ID\":3,\n" +
"\t\t\"PID\":1,\n" +
"\t\t\"Code\":\"1.2\",\n" +
"\t\t\"Description\":\"中高层住宅(≤18F)\",\n" +
"\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\"type\":\"yt\",\n" +
"\t\t\"Amount\":36,\n" +
"\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\"BuildingArea\":6,\n" +
"\t\t\"ExistLY\":true,\n" +
"\t\t\"ProjectCategoryCode\":\"001001002\",\n" +
"\t\t\"IsMainMajor\":true\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"ID\":4,\n" +
"\t\t\"PID\":1,\n" +
"\t\t\"Code\":\"1.3\",\n" +
"\t\t\"Description\":\"高层住宅(≤43F)\",\n" +
"\t\t\"TradeCode\":\"1001\",\n" +
"\t\t\"type\":\"yt\",\n" +
"\t\t\"Amount\":36,\n" +
"\t\t\"AmountIncludeTax\":39.24,\n" +
"\t\t\"BuildingArea\":0,\n" +
"\t\t\"ExistLY\":false,\n" +
"\t\t\"ProjectCategoryCode\":\"001001003\",\n" +
"\t\t\"IsMainMajor\":true\n" +
"\t}\n" +
"]";
Object results = JSONPath.eval(JSONObject.parseObject(json), "$.BidNode..[?(@.type in ('zy', 'yt','category'))]");
assertEquals(expect, JSON.toJSONString(results, JSONWriter.Feature.PrettyFormat));
}
}

0 comments on commit 4918708

Please sign in to comment.