Skip to content

Commit 6003ef0

Browse files
authored
Merge pull request #1149 from HubSpot/json-resolved-expressions
Do not add broken JSON to resolved expressions.
2 parents 4820ad3 + 1689174 commit 6003ef0

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

src/main/java/com/hubspot/jinjava/el/ExpressionResolver.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,24 @@ private Object resolveExpression(String expression, boolean addToResolvedExpress
8787
}
8888
expression = expression.trim();
8989
if (addToResolvedExpressions) {
90+
if (WhitespaceUtils.isWrappedWith(expression, "[", "]")) {
91+
String commaSeparatedExpress = expression
92+
.substring(1, expression.length() - 1)
93+
.trim();
94+
// Over-simplified way to detect JSON format, avoid to break it for adding resolved expressions.
95+
if (
96+
!commaSeparatedExpress.startsWith("{") || !commaSeparatedExpress.endsWith("}")
97+
) {
98+
Arrays
99+
.stream(commaSeparatedExpress.split(","))
100+
.forEach(substring ->
101+
interpreter.getContext().addResolvedExpression(substring.trim())
102+
);
103+
}
104+
}
90105
interpreter.getContext().addResolvedExpression(expression);
91106
}
92107

93-
if (WhitespaceUtils.isWrappedWith(expression, "[", "]")) {
94-
Arrays
95-
.stream(expression.substring(1, expression.length() - 1).split(","))
96-
.forEach(substring ->
97-
interpreter.getContext().addResolvedExpression(substring.trim())
98-
);
99-
}
100108
try {
101109
String elExpression = EXPRESSION_START_TOKEN + expression + EXPRESSION_END_TOKEN;
102110
ValueExpression valueExp = expressionFactory.createValueExpression(

src/test/java/com/hubspot/jinjava/util/EagerExpressionResolverTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,21 @@ public void itSplitsResolvedExpression() {
772772
.containsExactlyInAnyOrder("['a', 'b']", "'a'", "'b'");
773773
}
774774

775+
@Test
776+
public void itDoesNotSplitJsonResolvedExpression() {
777+
eagerResolveExpression("{'a': 1, 'b': 2}");
778+
assertThat(context.getResolvedExpressions())
779+
.containsExactlyInAnyOrder("{'a': 1, 'b': 2}");
780+
}
781+
782+
@Test
783+
public void itDoesNotSplitJsonInArrayResolvedExpression() {
784+
// It should not add the broke JSON `{'a': 1` to resolved expressions.
785+
eagerResolveExpression("[{'a': 1, 'b': 2}]");
786+
assertThat(context.getResolvedExpressions())
787+
.containsExactlyInAnyOrder("[{'a': 1, 'b': 2}]");
788+
}
789+
775790
@Test
776791
public void itHandlesRandom() {
777792
assertThat(eagerResolveExpression("range(1)|random").toString())

0 commit comments

Comments
 (0)