From 9fc7301be7f0b9c142151f3936c1df0152be8a74 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Mon, 29 Jun 2026 06:01:29 +0800 Subject: [PATCH] fix: clean std.parseJson incomplete input errors Motivation: std.parseJson on empty or truncated JSON input leaked the underlying parser's incomplete-input failure instead of returning a stable sjsonnet error. Modification: Handle ujson.IncompleteParseException in std.parseJson and add new_test_suite regressions for empty and truncated JSON input. Result: Incomplete JSON input now reports a concise Invalid JSON error. --- sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala | 2 ++ .../new_test_suite/error.parsejson_empty_input.jsonnet | 1 + .../new_test_suite/error.parsejson_empty_input.jsonnet.golden | 1 + .../new_test_suite/error.parsejson_truncated_input.jsonnet | 1 + .../error.parsejson_truncated_input.jsonnet.golden | 1 + 5 files changed, 6 insertions(+) create mode 100644 sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet.golden create mode 100644 sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet create mode 100644 sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet.golden diff --git a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala index 8bf0b191..364fd522 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala @@ -130,6 +130,8 @@ object ManifestModule extends AbstractFunctionModule { } catch { case e: ujson.ParseException => throw Error.fail("Invalid JSON: " + e.getMessage, pos)(ev) + case _: ujson.IncompleteParseException => + throw Error.fail("Invalid JSON: unexpected end of JSON input", pos)(ev) } } } diff --git a/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet b/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet new file mode 100644 index 00000000..26218f13 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet @@ -0,0 +1 @@ +std.parseJson("") diff --git a/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet.golden new file mode 100644 index 00000000..bb934b2b --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.parsejson_empty_input.jsonnet.golden @@ -0,0 +1 @@ +sjsonnet.Error: [std.parseJson] Invalid JSON: unexpected end of JSON input diff --git a/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet b/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet new file mode 100644 index 00000000..92404731 --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet @@ -0,0 +1 @@ +std.parseJson('{"a":') diff --git a/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet.golden new file mode 100644 index 00000000..bb934b2b --- /dev/null +++ b/sjsonnet/test/resources/new_test_suite/error.parsejson_truncated_input.jsonnet.golden @@ -0,0 +1 @@ +sjsonnet.Error: [std.parseJson] Invalid JSON: unexpected end of JSON input