diff --git a/qobject/json-parser.c b/qobject/json-parser.c index 63e9229f1ce3aa749a3d868e7a0ab9aa118ab6fd..3318b8dad04f5bbdd4533477c1d352290a766dc5 100644 --- a/qobject/json-parser.c +++ b/qobject/json-parser.c @@ -208,10 +208,11 @@ static QString *parse_string(JSONParserContext *ctxt, JSONToken *token) } break; case '%': - if (ctxt->ap) { + if (ctxt->ap && ptr[1] != '%') { parse_error(ctxt, token, "can't interpolate into string"); goto out; } + ptr++; /* fall through */ default: cp = mod_utf8_codepoint(ptr, 6, &end); diff --git a/tests/check-qjson.c b/tests/check-qjson.c index a1854573de9ff05f0e3693d76567d5c23d6ddb7c..cc13f3d41e0b2b1f01c621f42b56bc79ac7686e4 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -1270,7 +1270,7 @@ static void simple_interpolation(void) QObject *obj; QLitObject decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(1), - QLIT_QNUM(2), + QLIT_QSTR("100%"), QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(32), QLIT_QNUM(42), @@ -1280,7 +1280,7 @@ static void simple_interpolation(void) embedded_obj = qobject_from_json("[32, 42]", &error_abort); g_assert(embedded_obj != NULL); - obj = qobject_from_jsonf_nofail("[%d, 2, %p]", 1, embedded_obj); + obj = qobject_from_jsonf_nofail("[%d, '100%%', %p]", 1, embedded_obj); g_assert(qlit_equal_qobject(&decoded, obj)); qobject_unref(obj);