From f241e623e70e014070ab10b22ac34251d3afeff7 Mon Sep 17 00:00:00 2001
From: Vasyl Khrystiuk
Date: Sun, 2 Jun 2024 00:43:35 +0300
Subject: [PATCH] added 'json' filter
---
src/main/java/liqp/filters/Filters.java | 3 ++-
src/main/java/liqp/filters/Json.java | 23 ++++++++++++++++++
src/test/java/liqp/filters/JsonTest.java | 31 ++++++++++++++++++++++++
3 files changed, 56 insertions(+), 1 deletion(-)
create mode 100644 src/main/java/liqp/filters/Json.java
create mode 100644 src/test/java/liqp/filters/JsonTest.java
diff --git a/src/main/java/liqp/filters/Filters.java b/src/main/java/liqp/filters/Filters.java
index 25331c87..7d5fcdfb 100644
--- a/src/main/java/liqp/filters/Filters.java
+++ b/src/main/java/liqp/filters/Filters.java
@@ -63,7 +63,8 @@ public final class Filters {
new Upcase(), //
new Url_Decode(), //
new Url_Encode(), //
- new Where() //
+ new Where(), //
+ new Json() //
);
static Filters JEKYLL_EXTRA_FILTERS = Filters.of( //
diff --git a/src/main/java/liqp/filters/Json.java b/src/main/java/liqp/filters/Json.java
new file mode 100644
index 00000000..59159823
--- /dev/null
+++ b/src/main/java/liqp/filters/Json.java
@@ -0,0 +1,23 @@
+package liqp.filters;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import liqp.TemplateContext;
+import liqp.TemplateParser;
+
+public class Json extends Filter {
+ @Override
+ public Object apply(Object value, TemplateContext context, Object... params) {
+ ObjectMapper mapper = context.getParser().mapper;
+
+ try {
+ return mapper.writeValueAsString(value);
+ } catch (JsonProcessingException e) {
+ context.addError(e);
+ if (context.getErrorMode() == TemplateParser.ErrorMode.STRICT) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ return value;
+ }
+ }
+}
diff --git a/src/test/java/liqp/filters/JsonTest.java b/src/test/java/liqp/filters/JsonTest.java
new file mode 100644
index 00000000..563d377c
--- /dev/null
+++ b/src/test/java/liqp/filters/JsonTest.java
@@ -0,0 +1,31 @@
+package liqp.filters;
+
+import liqp.Template;
+import liqp.TemplateParser;
+import org.junit.Test;
+
+import java.util.HashMap;
+
+import static org.junit.Assert.*;
+
+public class JsonTest {
+
+ @Test
+ public void testWhenStringIsInputShouldBeStringified() {
+ Template template = TemplateParser.DEFAULT.parse("{{ 'Hello, World!' | json }}");
+ String rendered = template.render();
+ assertEquals("\"Hello, World!\"", rendered);
+ }
+
+ @Test
+ public void testWhenObjectIsInputShouldBeStringified() {
+ Template template = TemplateParser.DEFAULT.parse("{{ obj | json }}");
+ java.util.Map map = new HashMap<>();
+ java.util.Map nested = new HashMap<>();
+ nested.put("key", "value");
+ map.put("obj", nested);
+
+ String rendered = template.render(map);
+ assertEquals("{\"key\":\"value\"}", rendered);
+ }
+}
\ No newline at end of file