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