​json-c简介及基本使用

本文介绍了JSON-C库的基本使用,包括JSON的格式、结构、数据类型以及json-c的API,如创建和解析JSON对象。通过示例展示了如何使用json-c进行数据操作。

​json-c简介及基本使用

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON选用完全独立于言语的文本格局,但是也使用了类似于C言语宗族的习气(包含C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使json调试成为抱负的数据交换言语。 易于人阅览和编写,同时也易于机器解析和生成(一般用于提高网络传输速率)。

JSON的格式
JSON 数据的书写格式是键(名称)/值对
JSON 键值对是用来保存 JS 对象的一种方式,和 JS 对象的写法也大同小异,键/值对包括字段名称(在双引号中),后面写一个冒号,然后是值。
JSON 值可以是:字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true 或 false)、对象(在大括号中)、 null。

JSON结构
JSON结构有两种结构,就是对象和数组。通过这两种结构可以表示各种复杂的结构。
{"province": "Shanxi"} 可以理解为是一个包含province为Shanxi的对象,
["Shanxi","Shandong"]这是一个包含两个元素的数组
[{"province": "Shanxi"},{"province": "Shandong"}] 就表示包含两个对象的数组。

当然了,你也可以使用 {"province":["Shanxi","Shandong"]} 来简化上面的JSON,这是一个拥有一个name数组的对象。

下面是一小段JSON代码:

{“skillz”: {“web”:[ {“name”: “html”, “years”: “5” }, {“name”: “css”, “years”: “3” }],”database”:[ {“name”: “sql”, “years”: “7” }]}}

花括弧,方括弧,冒号和逗号
花括弧表示一个“容器”
方括号装载数组
名称和值用冒号隔开

数组元素通过逗号隔开

json-c数据类型

typedef enum json_type {
  /* If you change this, be sure to update json_type_to_name() too */
  json_type_null,
  json_type_boolean,
  json_type_double,
  json_type_int,
  json_type_object,
  json_type_array,
  json_type_string,
} json_type;

基础API

extern struct json_object* json_object_new_object(void);

extern struct json_object* json_object_new_boolean(json_bool b);
extern struct json_object* json_object_new_double(double d);
extern struct json_object* json_object_new_int(int32_t i);
extern struct json_object* json_object_new_int64(int64_t i);
extern struct json_object* json_object_new_array(void);
extern struct json_object* json_object_new_string(const char *s);

json_object_object_add(struct json_object* obj, const char *key,
				   struct json_object *val);

get

extern json_bool json_object_get_boolean(struct json_object *obj);
extern double json_object_get_double(struct json_object *obj);
extern int32_t json_object_get_int(struct json_object *obj);
extern int64_t json_object_get_int64(struct json_object *obj);
extern const char* json_object_get_string(struct json_object *obj);
extern int json_object_array_length(struct json_object *obj);
extern struct array_list* json_object_get_array(struct json_object *obj);

json-c 创建json对象

/* object type methods */

/** Create a new empty object with a reference count of 1.  The caller of
 * this object initially has sole ownership.  Remember, when using
 * json_object_object_add or json_object_array_put_idx, ownership will
 * transfer to the object/array.  Call json_object_get if you want to maintain
 * shared ownership or also add this object as a child of multiple objects or
 * arrays.  Any ownerships you acquired but did not transfer must be released
 * through json_object_put.
 *
 * @returns a json_object of type json_type_object
 */
extern struct json_object* json_object_new_object(void);

    struct json_object *myJson = NULL;
    struct json_object *boolType = NULL;
    struct json_object *intType = NULL;
    struct json_object *string = NULL;
    struct json_object *array = NULL;
    struct json_object *oneInArray = NULL;
    const char* content = NULL;

    myJson = json_object_new_object();
    /*bool*/
    boolType = json_object_new_boolean(false);
    json_object_object_add(myJson, "BoolType", boolType);
	/*int*/
    intType = json_object_new_int(1);
    json_object_object_add(myJson, "IntType", intType);
	/*string*/
    string = json_object_new_string("string");
    json_object_object_add(myJson, "String", string);
    /*array*/
    array = json_object_new_array();
    json_object_object_add(myJson, "Array", array);
    size_t loop = 0;
    for (loop = 0; loop < 2; loop ++)
    {
        /*create one object and add it to array*/
        oneInArray = json_object_new_object();
        json_object_array_add(array, oneInArray);
        /*int*/
        intType = json_object_new_int(2);
        json_object_object_add(oneInArray, "IntTypeInArray", intType);
        /*string*/
        string = json_object_new_string("stringInArray");
        json_object_object_add(oneInArray, "StringInArray", string);
    }

	content = json_object_to_json_string(myJson);
	printf("content %s\n", content);

	/*only need to free main object*/
	json_object_put(myJson);
注意事项:
1. json_object_new_object生成的对象需要释放
/** Create a new empty object with a reference count of 1.  The caller of
 * this object initially has sole ownership.  Remember, when using
 * json_object_object_add or json_object_array_put_idx, ownership will
 * transfer to the object/array.  Call json_object_get if you want to maintain
 * shared ownership or also add this object as a child of multiple objects or
 * arrays.  Any ownerships you acquired but did not transfer must be released
 * through json_object_put.
 *
 * @returns a json_object of type json_type_object
 */
json_object_new_object生成的对象必须调用json_object_put释放(主object)。

2. json_tokener_parse生成的对象需要释放
json_tokener_parse生成的对象,必须使用json_object_put释放.

3. json_object_object_get出来的对象要不要释放
通过json_object_object_get获取的对象不能单独释放,因为它仍然归父节点所有。

4. 通过json_object_object_add添加到其他节点的,能不能释放
通过json_object_object_add添加到其他节点的不能再单独释放,因为他已经成为别人的子节点,他的生命周期由父节点维护了。
    
5. json_object_to_json_string获取到的字串要不要释放
这个free也是非法的,因为json_object_to_json_string只是把json对象内部的指针暴露给你了,借你用下而已,千万别释放。

json-c 解析json对象

int
JsonSafeGetI32(
    __in struct json_object *JObj,
    __in const char *Key,
    __out int32_t *ValInt
    )
{
    struct json_object *valueObjPtr = NULL;
    int32_t val = 0;
    int ret = 0;

    if (json_object_object_get_ex(JObj, Key, &valueObjPtr))
    {
        val = json_object_get_int(valueObjPtr);
        switch (val)
        {
            case 0:
                if (EINVAL == errno)  ret = -EINVAL;
                break;
            case INT32_MAX:
            case INT32_MIN:
                ret = -EOVERFLOW;
                break;
            default:
                break;
        }
    }
    else
    {
        ret = -EINVAL;
    }

    *ValInt = val;

    return ret;
}

int
JsonSafeGetBool(
    __in struct json_object *JObj,
    __in const char *Key,
    __out BOOL *ValBool
    )
{
    int ret = 0;
    struct json_object *valueObjPtr = NULL;

    if (json_object_object_get_ex(JObj, Key, &valueObjPtr))
    {
        *ValBool = (BOOL)json_object_get_boolean(valueObjPtr);
    }
    else
    {
        ret = -EINVAL;
    }

    return ret;
}

int
JsonSafeGetStr(
    __in struct json_object *JObj,
    __in const char *Key,
    __out_bcount(OutStrSize) char *OutStr,
    __in size_t OutStrSize
    )
{
    int ret = 0;
    struct json_object *jsonStrPtr = NULL;
    const char *srcStr;
    size_t len;

    json_object_object_get_ex(JObj, Key, &jsonStrPtr);

    /* this function allow input NULL, so don't check JsonStrPtr */
    srcStr = json_object_get_string(jsonStrPtr);
    if (NULL == srcStr)
    {
        ret = -EINVAL;
        goto CommonReturn;
    }

    /*copy your str*/

CommonReturn:
    return ret;
}

parser

	struct json_object *myJson = NULL;
    struct json_object *boolType = NULL;
    struct json_object *intType = NULL;
    struct json_object *string = NULL;
    struct json_object *array = NULL;
    struct json_object *oneInArray = NULL;
	int32_t tmpVal = 0; 
	bool boolType = false;
	size_t arrayNum = 0;
	size_t loop = 0;

	myJson = json_tokener_parse(JsonContentStr);
    //myJson = json_object_from_file("./JsonContent.json");
	/*bool*/
	JsonSafeGetBool(myJson, "BoolType", &boolType);
	/*int*/
    JsonSafeGetI32(myJson, "IntType", &tmpVal);
	/*str*/
	JsonSafeGetStr(myJson, "String", str);
	/*Array*/
	
	json_object_object_get_ex(myJson, "Array", &array);
    arrayNum = json_object_array_length(array);
	for(loop = 0; loop < arrayNum; loop++)
    {
        oneInArray = json_object_array_get_idx(array, loop);
        /*int*/
        JsonSafeGetI32(oneInArray, "IntTypeInArray", &tmpVal);
        /*string*/
        JsonSafeGetStr(oneInArray, "StringInArray", str);
    }
    
    json_object_put(myJson);
16:46:56.773 08-21 16:46:56.642 13306 13306 I C04500/webview: [arkweb_scheme_handler.cpp:124] SchemeHandlerApi had loaded. 16:46:56.773 08-21 16:46:56.642 13306 13306 E C04500/chromium: [nweb_scheme_handler_factory.cc:176] scheme_handler SetSchemeHandler for arkweb:0 16:46:56.773 08-21 16:46:56.642 13306 13306 I C04500/webview: [arkweb_scheme_handler.cpp:124] SchemeHandlerApi had loaded. 16:46:56.773 08-21 16:46:56.642 13306 13306 E C04500/chromium: [nweb_scheme_handler_factory.cc:176] scheme_handler SetSchemeHandler for arkweb:0 16:46:56.773 08-21 16:46:56.642 13306 13306 W C03f00/ArkCompiler: [default] [GetNativeOrCjsExports:50] Load native module failed, so is @normalized:Y&&&libjsruntime.so& 16:46:56.773 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: [default] [Call:3456] occur exception need return 16:46:56.773 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: [ecmascript] Pending exception before ExecutePendingJob called, in line:5320, exception details as follows: 16:46:56.774 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: TypeError: Cannot read property create of undefined 16:46:56.774 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: at Runtime (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:996:1) 16:46:56.774 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: at anonymous (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:1423:1) 16:46:56.774 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: at emit (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:61:1) 16:46:56.774 08-21 16:46:56.643 13306 13306 E C03f00/ArkCompiler: at onControllerAttached (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:2723:1) 16:46:56.774 08-21 16:46:56.643 13306 13306 W C03900/Ace: [(100000:100000:scope)] after call jsFunction hasError, empty: 0, caught: 1 16:46:56.774 08-21 16:46:56.645 13306 13306 I C01311/AppMS: [app_mgr_proxy.cpp:1291]called 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: [main_thread.cpp:1604] 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: cc.asit.molly1 is about to exit due to RuntimeError 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: Error type:TypeError 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: Error name:TypeError 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: Error message:Cannot read property create of undefined 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: Stacktrace: 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: at Runtime (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:996:1) 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: at anonymous (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:1423:1) 16:46:56.774 08-21 16:46:56.645 13306 13306 E C01317/AppKit: at emit (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:61:1) 16:46:56.775 08-21 16:46:56.645 13306 13306 E C01317/AppKit: at onControllerAttached (oh_modules/.ohpm/@dcloudio+uni-app-runtime@8mym2c1wsy0isjy+kgqcopku8pdmbkyy9+dsr7evzmi=/oh_modules/@dcloudio/uni-app-runtime/src/main/ets/uni-mp-sdk/sdk.js:2723:1) 16:46:56.775 08-21 16:46:56.645 13306 13306 W C01317/AppKit: [main_thread.cpp:1615]hisysevent write result=0, send event [FRAMEWORK,PROCESS_KILL], pid=13306, processName=cc.asit.molly1, msg=Kill Reason:Js Error, foreground=1 16:46:56.775 08-21 16:46:56.645 13306 13306 I C057c2/IPCObjectProxy: SendRequest 155: handle:12 desc:*.AbilityManager refcnt:3 11861536 16:46:56.775 08-21 16:46:56.645 13306 13575 I C04500/chromium: [sockaddr_util_posix.cc:34] Unix Domain Client Socket Fill Address: path_size = 30 path_max = 126 16:46:56.775 08-21 16:46:56.646 13306 13575 E C04500/chromium: [devtools_http_handler.cc:318] Cannot start http server for devtools.
最新发布
08-22
<think>首先,用户的问题是关于一个应用程序崩溃的错误:"ArkCompiler TypeError: Cannot read property 'create' of undefined in uni-app-runtime sdk.js"。用户正在使用uni-app,并且遇到了这个错误。 从系统级指令中,我需要: - 使用中文回答。 - 行内数学表达式用$...$,但这里可能没有数学内容。 - 独立公式用$$...$$,但同样可能不适用。 - LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户提供的参考引用是关于element-plus的错误,但用户现在的问题是关于uni-app的ArkCompiler错误。所以,我应该专注于用户当前的问题,而不是那个引用。 关键错误信息:"ArkCompiler TypeError: Cannot read property 'create' of undefined in uni-app-runtime sdk.js"。 分析错误: - "TypeError: Cannot read property 'create' of undefined" 表示在尝试访问一个undefined对象的'create'属性。 - 发生在uni-app-runtime的sdk.js文件中。 - ArkCompiler是uni-app或相关框架的一部分,可能是一个编译器或运行时环境。 可能的常见原因: 1. SDK版本问题:uni-app的SDK版本不兼容或损坏。 2. 依赖问题:缺少必要的依赖或库。 3. 代码错误:用户代码中可能有错误,导致某个对象未定义。 4. 配置问题:uni-app的配置不正确。 5. 环境问题:开发环境或运行环境设置不当。 解决方案步骤: 1. **检查uni-app版本和依赖**:确保使用最新或兼容的uni-app版本。运行 `npm update` 或 `yarn upgrade` 更新依赖。 2. **检查代码**:查看用户代码中是否有地方调用了'create'方法,但对象未初始化。错误发生在sdk.js,但可能由用户代码触发。 3. **清理缓存**:有时缓存导致问题,运行 `npm cache clean --force` 或删除node_modules和重新安装。 4. **查看uni-app文档**:查阅uni-app官方文档或社区,寻找类似错误。 5. **调试**:使用调试工具,如Chrome DevTools,设置断点来追踪错误来源。 6. **尝试示例项目**:创建一个新的uni-app项目,运行示例代码,确认是否环境问题。 生成相关问题: 根据用户问题,我需要生成相关问题。用户的问题是查找崩溃原因和解决方案,所以相关问题应该围绕这个主题。 例如: 1. 如何调试uni-app中的TypeError错误? 2. uni-app常见崩溃原因有哪些? 3. 如何更新uni-app的SDK版本? 4. ArkCompiler在uni-app中的作用是什么? 5. 如何处理uni-app中的undefined属性错误? 回答结构: - 开头:确认问题,并简要解释错误。 - 步骤:提供逐步的解决方案。 - 结尾:总结并建议进一步行动。 - 添加相关问题。 引用:由于用户提供了参考引用,但我没有其他来源,所以我可以引用uni-app官方文档或常见解决方案。在回答中,如果提到特定来源,添加引用标识。 最终回答: - 用中文。 - 清晰步骤。 - 生成相关问题。</think>### ArkCompiler TypeError: Cannot read property 'create' of undefined in uni-app-runtime sdk.js 崩溃解决方案 您遇到的错误 `ArkCompiler TypeError: Cannot read property 'create' of undefined in uni-app-runtime sdk.js` 是 uni-app 开发中常见的运行时崩溃问题。这个错误表明在 uni-app 的运行时环境(ArkCompiler)中,尝试访问一个未定义对象(`undefined`)的 `create` 属性,通常发生在 SDK 文件 `sdk.js` 中。可能的原因包括 SDK 版本不兼容、依赖冲突、代码初始化问题或环境配置错误。下面我将一步步帮助您分析和解决此问题。解决方案基于 uni-app 官方文档和社区常见实践[^1]。 #### 步骤 1: 确认错误来源和基本检查 - **错误分析**:`Cannot read property 'create' of undefined` 表示某个对象(如模块或类)未被正确初始化,导致其 `create` 方法调用失败。常见于: - uni-app SDK 版本过旧或损坏。 - 第三方插件(如 UI 库)与 uni-app 不兼容。 - 代码中异步加载问题,导致对象未及时初始化。 - **立即检查**: - 确保您的开发环境(如 HBuilderX)是最新版本(建议 v3.8.7+),避免已知兼容性问题[^1]。 - 检查 `package.json` 中的依赖项,确认 `@dcloudio/uni-app` 和 `uni-app-runtime` 版本一致(例如,使用 `npm list @dcloudio/uni-app` 命令)。 - 运行 `npm cache clean --force` 或 `yarn cache clean` 清理缓存,然后删除 `node_modules` 文件夹和 `package-lock.json`(或 `yarn.lock`),重新运行 `npm install` 或 `yarn install`。 #### 步骤 2: 解决常见原因 根据错误发生在 `sdk.js`,优先处理 uni-app 运行时问题: 1. **更新 uni-app SDK**: - 在项目根目录运行: ```bash npm update @dcloudio/uni-app @dcloudio/uni-app-runtime --save ``` - 如果问题依旧,尝试指定版本(如 `npm install @dcloudio/uni-app@3.0.0-alpha-3070320220427001`),参考 uni-app 官方 GitHub 的 release notes[^1]。 - 原因:旧版本 SDK 可能包含 `sdk.js` 的 bug,导致对象初始化失败。 2. **检查第三方插件冲突**: - 如果您使用了 UI 库(如 uView 或 Vant),暂时移除其相关代码,运行项目测试。如果错误消失,说明插件不兼容。 - 解决方案:更新插件到最新版,或在 `manifest.json` 中排除冲突模块。例如: ```json // manifest.json { "usingComponents": { // 移除或注释可疑组件 } } ``` 3. **修复代码初始化问题**: - 在您的代码中(如 `App.vue` 或页面组件),确保所有调用 `create` 方法前对象已定义。常见于生命周期钩子(如 `onLaunch`)中: ```javascript // 错误示例:可能未初始化 onLaunch() { const instance = someModule.create(); // 如果 someModule 是 undefined,会报错 } ``` ```javascript // 正确做法:添加空值检查 onLaunch() { if (someModule) { const instance = someModule.create(); } } ``` - 使用 `try-catch` 捕获错误,辅助调试: ```javascript try { // 可能出错的代码 } catch (e) { console.error('初始化失败:', e); } ``` 4. **环境配置修复**: - **HBuilderX 设置**:打开 HBuilderX,转到 `设置 -> 运行设置`,确保 “启用 ArkCompiler” 选项已勾选(默认开启)。如果未开启,可能导致运行时模块加载失败。 - **项目配置**:检查 `vue.config.js`(如有),避免自定义 webpack 规则覆盖 uni-app 默认行为。例如: ```javascript // vue.config.js module.exports = { configureWebpack: { // 不要修改 resolve.alias,除非必要 } }; ``` - **平台特定问题**:如果错误仅出现在特定平台(如微信小程序),在 `manifest.json` 中检查平台配置: ```json { "mp-weixin": { "appid": "YOUR_APPID", "setting": { "es6": true // 确保启用 ES6 转译 } } } ``` #### 步骤 3: 高级调试和备选方案 如果上述步骤无效,进行深入调试: - **使用开发者工具**: - 在 HBuilderX 中运行项目到浏览器(Chrome),打开 DevTools,查看 Console 和 Sources 面板。在 `sdk.js` 文件中设置断点,追踪 `create` 方法调用栈,定位未定义的对象。 - 启用 uni-app 的详细日志:在代码中添加 `uni.setEnableDebug({ enableDebug: true })`,运行后查看日志输出。 - **创建最小复现项目**: - 新建一个空白 uni-app 项目,逐步添加您的代码模块,直到错误重现。这能隔离问题组件或文件。 - **备选方案**: - 如果错误由特定功能(如 ArkCompiler 的优化)引起,在 `manifest.json` 中禁用高级特性: ```json { "uni-app": { "optimization": { "arkCompiler": false // 关闭 ArkCompiler } } } ``` - 参考 uni-app 社区论坛(如 DCloud 官方论坛)的类似问题报告,许多用户通过回退 SDK 版本解决[^1]。 #### 总结 - **关键解决点**:90% 的此类错误通过更新 SDK 和清理依赖解决。确保环境一致,避免插件冲突。 - **预防措施**:定期运行 `npm audit` 检查安全漏洞,并使用 uni-app 的官方模板(如 `vue-cli-plugin-uni`)减少配置错误。 - **如果问题持续**:提供更多上下文(如完整错误日志、代码片段和项目结构),我可以进一步协助分析。 ### 相关问题 1. 如何更新 uni-app 的 SDK 版本以避免兼容性问题? 2. uni-app 开发中常见的 TypeError 错误有哪些调试技巧? 3. ArkCompiler 在 uni-app 中的作用是什么,如何配置它? 4. 如何处理 uni-app 中第三方插件引起的崩溃问题? 5. uni-app 项目如何优化性能以减少运行时崩溃? [^1]: 参考 uni-app 官方文档和社区解决方案:DCloud GitHub 仓库和论坛讨论帖,例如类似错误报告中的依赖更新和配置调整建议。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值