diff --git a/interfaces/inner_api/appexecfwk_base/include/json_util.h b/interfaces/inner_api/appexecfwk_base/include/json_util.h index f9921fd2b4c4b177c6c483c250c4bfb70c818049..d49f5237446ec2acb8ab71d7c996134d9f206dde 100644 --- a/interfaces/inner_api/appexecfwk_base/include/json_util.h +++ b/interfaces/inner_api/appexecfwk_base/include/json_util.h @@ -48,6 +48,7 @@ public: static void GetBoolValueIfFindKey(const nlohmann::json &jsonObject, const nlohmann::detail::iter_impl &end, const std::string &key, bool &data, bool isNecessary, int32_t &parseResult); + static bool CheckMapValueType(JsonType valueType, const nlohmann::json &value); }; template @@ -150,7 +151,7 @@ void GetValueIfFindKey(const nlohmann::json &jsonObject, const nlohmann::detail: return; } if (isNecessary) { - APP_LOGE("profile prop %{public}s mission", key.c_str()); + APP_LOGE("profile prop %{public}s missing", key.c_str()); parseResult = ERR_APPEXECFWK_PARSE_PROFILE_MISSING_PROP; } } @@ -205,7 +206,37 @@ void GetBigStringIfFindKey(const nlohmann::json &jsonObject, return; } if (isNecessary) { - APP_LOGE("profile prop %{public}s mission", key.c_str()); + APP_LOGE("profile prop %{public}s missing", key.c_str()); + parseResult = ERR_APPEXECFWK_PARSE_PROFILE_MISSING_PROP; + } +} + +template +void GetMapValueIfFindKey(const nlohmann::json &jsonObject, + const nlohmann::detail::iter_impl &end, const std::string &key, dataType &data, + bool isNecessary, int32_t &parseResult, JsonType valueType) +{ + if (parseResult != ERR_OK) { + return; + } + if (jsonObject.find(key) != end) { + if (!jsonObject.at(key).is_object()) { + APP_LOGE("type error %{public}s not map object", key.c_str()); + parseResult = ERR_APPEXECFWK_PARSE_PROFILE_PROP_TYPE_ERROR; + return; + } + for (const auto& [mapKey, mapValue] : jsonObject.at(key).items()) { + if (!BMSJsonUtil::CheckMapValueType(valueType, mapValue)) { + APP_LOGE("type error key:%{public}s", mapKey.c_str()); + parseResult = ERR_APPEXECFWK_PARSE_PROFILE_PROP_TYPE_ERROR; + return; + } + } + data = jsonObject.at(key).get(); + return; + } + if (isNecessary) { + APP_LOGE("profile prop %{public}s missing", key.c_str()); parseResult = ERR_APPEXECFWK_PARSE_PROFILE_MISSING_PROP; } } diff --git a/interfaces/inner_api/appexecfwk_base/src/bms_json_util.cpp b/interfaces/inner_api/appexecfwk_base/src/bms_json_util.cpp index bb702b91560f1cca5eafa94503715396b7bfc293..30e6be2401c614e1f71157116c5d19a5f7e40301 100644 --- a/interfaces/inner_api/appexecfwk_base/src/bms_json_util.cpp +++ b/interfaces/inner_api/appexecfwk_base/src/bms_json_util.cpp @@ -61,5 +61,19 @@ void BMSJsonUtil::GetBoolValueIfFindKey(const nlohmann::json &jsonObject, parseResult = ERR_APPEXECFWK_PARSE_PROFILE_MISSING_PROP; } } + +bool BMSJsonUtil::CheckMapValueType(JsonType valueType, const nlohmann::json &value) +{ + switch (valueType) { + case JsonType::BOOLEAN: + return value.is_boolean(); + case JsonType::NUMBER: + return value.is_number(); + case JsonType::STRING: + return value.is_string(); + default: + return false; + } +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/interfaces/inner_api/appexecfwk_base/src/shortcut_info.cpp b/interfaces/inner_api/appexecfwk_base/src/shortcut_info.cpp index 2eb0e34a2aa518621f1503d5d20bf559e65ae661..dba662dba9d04b86edbfcaa746b941d0315eef39 100644 --- a/interfaces/inner_api/appexecfwk_base/src/shortcut_info.cpp +++ b/interfaces/inner_api/appexecfwk_base/src/shortcut_info.cpp @@ -192,14 +192,13 @@ void from_json(const nlohmann::json &jsonObject, ShortcutIntent &shortcutIntent) shortcutIntent.targetClass, false, parseResult); - GetValueIfFindKey>(jsonObject, + GetMapValueIfFindKey>(jsonObject, jsonObjectEnd, JSON_KEY_BUNDLE_PARAMETERS, shortcutIntent.parameters, - JsonType::OBJECT, false, parseResult, - ArrayType::NOT_ARRAY); + JsonType::STRING); if (parseResult != ERR_OK) { APP_LOGE("read shortcutIntent jsonObject error : %{public}d", parseResult); } @@ -344,14 +343,13 @@ void from_json(const nlohmann::json &jsonObject, ShortcutWant &shortcutWant) shortcutWant.abilityName, false, parseResult); - GetValueIfFindKey>(jsonObject, + GetMapValueIfFindKey>(jsonObject, jsonObjectEnd, JSON_KEY_BUNDLE_PARAMETERS, shortcutWant.parameters, - JsonType::OBJECT, false, parseResult, - ArrayType::NOT_ARRAY); + JsonType::STRING); if (parseResult != ERR_OK) { APP_LOGE("read shortcutWant module.json error : %{public}d", parseResult); }