From a7448b7fa027facf50f59d6e9d9c0bde81931b73 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Tue, 31 Oct 2023 21:34:30 +0800 Subject: [PATCH] make `json.loads` accept `bytes` --- 3rd/cjson/src/cJSONw.cpp | 9 +++++++-- docs/modules/json.md | 4 ++-- include/typings/cjson.pyi | 2 +- src/pocketpy.cpp | 9 +++++++-- tests/80_json.py | 2 ++ 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/3rd/cjson/src/cJSONw.cpp b/3rd/cjson/src/cJSONw.cpp index 3e832248..4f4479c6 100644 --- a/3rd/cjson/src/cJSONw.cpp +++ b/3rd/cjson/src/cJSONw.cpp @@ -112,8 +112,13 @@ void add_module_cjson(VM* vm){ cJSON_InitHooks(&hooks); vm->bind_func<1>(mod, "loads", [](VM* vm, ArgsView args){ - const Str& string = CAST(Str&, args[0]); - cJSON *json = cJSON_ParseWithLength(string.data, string.size); + std::string_view sv; + if(is_non_tagged_type(args[0], vm->tp_bytes)){ + sv = PK_OBJ_GET(Bytes, args[0]).sv(); + }else{ + sv = CAST(Str&, args[0]).sv(); + } + cJSON *json = cJSON_ParseWithLength(sv.data(), sv.size()); if(json == NULL){ const char* start = cJSON_GetErrorPtr(); const char* end = start; diff --git a/docs/modules/json.md b/docs/modules/json.md index 4a46c13a..4705d64c 100644 --- a/docs/modules/json.md +++ b/docs/modules/json.md @@ -9,11 +9,11 @@ pkpy has two JSON modules. **Their interfaces are the same.** `cjson` is faster while the built-in `json` is more stable since it was developed earlier. -### `json.loads(s)` +### `json.loads(data: str | bytes)` Decode a JSON string into a python object. -### `json.dumps(obj)` +### `json.dumps(obj) -> str` Encode a python object into a JSON string. diff --git a/include/typings/cjson.pyi b/include/typings/cjson.pyi index 6abdbde5..1861d4bc 100644 --- a/include/typings/cjson.pyi +++ b/include/typings/cjson.pyi @@ -1,2 +1,2 @@ -def loads(string: str) -> object: ... +def loads(data: str | bytes) -> object: ... def dumps(obj: object) -> str: ... diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 44f795f2..fa11c97f 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1509,8 +1509,13 @@ void add_module_sys(VM* vm){ void add_module_json(VM* vm){ PyObject* mod = vm->new_module("json"); vm->bind_func<1>(mod, "loads", [](VM* vm, ArgsView args) { - const Str& expr = CAST(Str&, args[0]); - CodeObject_ code = vm->compile(expr, "", JSON_MODE); + std::string_view sv; + if(is_non_tagged_type(args[0], vm->tp_bytes)){ + sv = PK_OBJ_GET(Bytes, args[0]).sv(); + }else{ + sv = CAST(Str&, args[0]).sv(); + } + CodeObject_ code = vm->compile(sv, "", JSON_MODE); return vm->_exec(code, vm->top_frame()->_module); }); diff --git a/tests/80_json.py b/tests/80_json.py index 8ee80b3e..5b63f449 100644 --- a/tests/80_json.py +++ b/tests/80_json.py @@ -29,6 +29,8 @@ assert json.loads("true") == True assert json.loads("false") == False assert json.loads("{}") == {} +assert json.loads(b"false") == False + _j = json.dumps(a) _a = json.loads(_j)