From 00ace859d51c2f04a8616764407fb7d570257e3f Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Fri, 28 Nov 2025 15:18:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20sample=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A3=80=E8=A7=86=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- README.md | 51 +- build-profile.json5 | 4 +- entry/src/generated/.gitkeep | 0 .../ets/common/components/CardContainer.ets | 120 ++++ .../ets/common/components/CellComponent.ets | 2 +- ...CaseDescriptor.ets => LayoutContainer.ets} | 45 +- .../ets/common/components/LogContainer.ets | 51 -- .../src/main/ets/common/components/NavBar.ets | 14 +- .../main/ets/common/constants/CodeExample.ets | 41 ++ ...absMenuConstants.ets => MenuConstants.ets} | 20 +- .../common/constants/NavigationConstants.ets | 6 +- .../ets/common/constants/PageConstant.ets | 28 - .../common/constants/PageRouteConstants.ets | 8 +- entry/src/main/ets/common/index.ets | 25 +- .../main/ets/common/styles/ButtonStyles.ets | 6 +- .../BigJsonFileDecodePage.ets | 376 ----------- .../LazyLoadJsonNodePage.ets | 607 ------------------ .../NetworkAndSendablePage.ets | 88 --- .../NetworkDataInteractionPage.ets | 82 --- .../ets/model/{sendableCase => }/Person.ets | 7 +- .../main/ets/model/PersonWithObservedV2.ets | 32 + .../src/main/ets/model/PersonWithSendable.ets | 31 + .../main/ets/pages/BigJsonFileDecodePage.ets | 244 +++++++ .../main/ets/pages/LazyLoadJsonNodePage.ets | 133 ++++ entry/src/main/ets/pages/MainPage.ets | 72 +-- .../ets/pages/NetworkAndObservedV2Page.ets | 187 ++++++ .../src/main/ets/pages/NetworkRequestPage.ets | 150 +++++ .../WithSendablePage.ets | 87 ++- entry/src/main/ets/utils/JsonNodeMethod.ets | 242 +++++++ .../{NetworkUtil.ets => TcpServerUtil.ets} | 88 ++- .../main/ets/viewmodel/JsonNodeViewModel.ets | 191 ++++++ .../main/resources/base/element/float.json | 2 +- .../main/resources/base/element/string.json | 296 +++++++-- hvigorfile.ts | 4 +- screenshots/device/image.png | Bin 145910 -> 128104 bytes 35 files changed, 1854 insertions(+), 1486 deletions(-) delete mode 100644 entry/src/generated/.gitkeep create mode 100644 entry/src/main/ets/common/components/CardContainer.ets rename entry/src/main/ets/common/components/{CaseDescriptor.ets => LayoutContainer.ets} (41%) delete mode 100644 entry/src/main/ets/common/components/LogContainer.ets create mode 100644 entry/src/main/ets/common/constants/CodeExample.ets rename entry/src/main/ets/common/constants/{TabsMenuConstants.ets => MenuConstants.ets} (64%) delete mode 100644 entry/src/main/ets/features/bigJSONFileDecodeCase/BigJsonFileDecodePage.ets delete mode 100644 entry/src/main/ets/features/lazyLoadJsonNodeCase/LazyLoadJsonNodePage.ets delete mode 100644 entry/src/main/ets/features/networkAndSendableCase/NetworkAndSendablePage.ets delete mode 100644 entry/src/main/ets/features/networkDataCase/NetworkDataInteractionPage.ets rename entry/src/main/ets/model/{sendableCase => }/Person.ets (90%) create mode 100644 entry/src/main/ets/model/PersonWithObservedV2.ets create mode 100644 entry/src/main/ets/model/PersonWithSendable.ets create mode 100644 entry/src/main/ets/pages/BigJsonFileDecodePage.ets create mode 100644 entry/src/main/ets/pages/LazyLoadJsonNodePage.ets create mode 100644 entry/src/main/ets/pages/NetworkAndObservedV2Page.ets create mode 100644 entry/src/main/ets/pages/NetworkRequestPage.ets rename entry/src/main/ets/{features/sendableCase => pages}/WithSendablePage.ets (38%) create mode 100644 entry/src/main/ets/utils/JsonNodeMethod.ets rename entry/src/main/ets/utils/{NetworkUtil.ets => TcpServerUtil.ets} (39%) create mode 100644 entry/src/main/ets/viewmodel/JsonNodeViewModel.ets diff --git a/README.md b/README.md index 5f045f6..1013caf 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # TurboTransJSON ## 简介 -本示例展示了使用TurboTrans实现高性能JSON序列化操作,覆盖场景包括 +本示例展示了使用TurboTrans实现高性能JSON序列化操作,覆盖场景包括: - 结合Sendable跨线程数据传递场景 - 网络数据交互场景 -- 结合跨线程和网络数据交互综合场景 +- 结合跨线程和网络数据交互场景 - JSON大文件解析 - JsonNode懒加载 ## 效果预览 @@ -16,44 +16,43 @@ entry/src/main/ets // 代码区 ├── common │ ├── components // 公共组件 -│ │ ├── CaseDescriptor.ets // 案例描述基础组件 +│ │ ├── CardContainer.ets // 功能模块卡片-案例描述,示例代码,执行结果 │ │ ├── CellComponent.ets // 单个功能模块菜单 │ │ ├── CellGroupComponent.ets // 功能模块卡片 -│ │ ├── LogContainer.ets // 示例日志显示区域 +│ │ ├── LayoutContainer.ets // 页面根布局组件 │ │ ├── NavBar.ets // 页面标题 │ │ └── interface │ │ └── MainPageListItem.ets // 单个菜单的数据结构定义 │ ├── constants +│ │ ├── CodeExample.ets // 示例代码 +│ │ ├── MenuConstants.ets // 首页菜单目录 │ │ ├── NavigationConstants.ets // 页面NavgationId常量 -│ │ ├── PageRouteConstants.ets // 页面name常量定义 -│ │ ├── RouterPageConstant.ets // 页面公共样式常量定义 -│ │ └── TabsMenuConstants.ets // 首页菜单目录 +│ │ ├── PageConstant.ets // 页面公共样式常量定义 +│ │ └── PageRouteConstants.ets // router name常量定义 │ ├── styles │ │ ├── BaseContentStyles.ets // 页面基础样式 │ │ └── ButtonStyles.ets // 按钮公共样式 │ └── index.ets // common入口文件 ├── entryability │ └── EntryAbility.ets // 应用入口ability -├── features -│ ├── bigJSONFileDecodeCase -│ │ └── BigJsonFileDecodePage.ets // 大文件解析示例 -│ ├── lazyLoadJsonNodeCase -│ │ └── LazyLoadJsonNodePage.ets // JsonNode懒加载示例 -│ ├── networkAndSendableCase -│ │ └── NetworkAndSendablePage.ets // 综合使用场景示例 -│ ├── networkDataCase -│ │ └── NetworkDataInteractionPage.ets // 网络请求示例 -│ └── sendableCase -│ └── WithSendablePage.ets // Sendable跨线程使用示例 ├── model -│ └── sendableCase -│ └── Person.ets // 序列化类定义 +│ └── Person.ets // 示例数据结构-普通Person类 +│ └── PersonWithObservedV2.ets // 示例数据结构-带ObservedV2和Sendable的Person类 +│ └── PersonWithSendable.ets // 示例数据结构-Sendable的Person类 ├── pages │ ├── Index.ets // entry页面,定义Navigation │ └── MainPage.ets // Navgation首页,提供示例入口 -└── utils - ├── Logger.ets // 日志工具 - └── NetworkUtil.ets // 本地服务端创建,模拟网络请求 +│ ├── BigJsonFileDecodePage.ets // 大文件解析 +│ ├── LazyLoadJsonNodePage.ets // JsonNode懒加载 +│ ├── NetworkAndObservedV2Page.ets // 结合跨线程和网络数据交互场景 +│ ├── NetworkRequestPage.ets // 网络数据交互场景 +│ └── WithSendablePage.ets // Sendable跨线程使用示例 +├── utils +│ ├── JsonNodeMethod.ets // JsonNode方法封装 +│ ├── Logger.ets // 日志工具 +│ └── NetworkUtil.ets // 本地服务端创建,模拟网络请求 +└── viewmodel + └── JsonNodeViewModel.ets // JsonNode懒加载页面数据 ``` @@ -66,6 +65,6 @@ entry/src/main/ets // 代码区 ## 约束与限制 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 -2. HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。 -3. DevEco Studio版本:DevEco Studio 5.0.5 Release及以上。 -4. HarmonyOS SDK版本:HarmonyOS 5.0.5 Release SDK及以上。 \ No newline at end of file +2. HarmonyOS系统:HarmonyOS 6.0.0 Release及以上。 +3. DevEco Studio版本:DevEco Studio 6.0.0 Release及以上。 +4. HarmonyOS SDK版本:HarmonyOS 6.0.0 Release SDK及以上。 \ No newline at end of file diff --git a/build-profile.json5 b/build-profile.json5 index 2dad823..efb2dcc 100644 --- a/build-profile.json5 +++ b/build-profile.json5 @@ -6,8 +6,8 @@ { "name": "default", "signingConfig": "default", - "targetSdkVersion": "5.0.5(17)", - "compatibleSdkVersion": "5.0.5(17)", + "targetSdkVersion": "6.0.0(20)", + "compatibleSdkVersion": "6.0.0(20)", "runtimeOS": "HarmonyOS", "buildOption": { "strictMode": { diff --git a/entry/src/generated/.gitkeep b/entry/src/generated/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/entry/src/main/ets/common/components/CardContainer.ets b/entry/src/main/ets/common/components/CardContainer.ets new file mode 100644 index 0000000..5f58d81 --- /dev/null +++ b/entry/src/main/ets/common/components/CardContainer.ets @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AttributeUpdater } from '@kit.ArkUI'; +import { PageConstants } from '../constants/PageConstant'; + +export enum CardType { + isCase, + isLog, + isCode +} + +export class TextStyles extends AttributeUpdater { + cardType: CardType = CardType.isCase; + + constructor(cardType: CardType) { + super(); + this.cardType = cardType; + } + + initializeModifier(instance: TextAttribute): void { + instance.lineHeight($r('app.float.desc_line_height')) + instance.fontSize($r('app.float.font_md')) + instance.fontColor($r('app.color.text_secondary')) + instance.align(Alignment.TopStart) + instance.constraintSize({ + minWidth: PageConstants.FULL_WIDTH, + }) + + if (this.cardType === CardType.isLog) { + instance.borderRadius($r('app.float.vp_16')) + instance.padding({ + left: $r('app.float.vp_16'), + right: $r('app.float.vp_16'), + top: $r('app.float.vp_8'), + bottom: $r('app.float.vp_8') + }) + instance.constraintSize({ + minWidth: PageConstants.FULL_WIDTH, + minHeight: $r('app.float.log_display_area_min_height') + }) + } + + if (this.cardType === CardType.isCode) { + instance.fontSize($r('app.float.font_sm')) + instance.padding({ + left: $r('app.float.vp_16'), + right: $r('app.float.vp_16'), + top: $r('app.float.vp_8'), + bottom: $r('app.float.vp_8') + }) + instance.fontFamily('monospace') + instance.constraintSize({ + minWidth: PageConstants.FULL_WIDTH, + minHeight: $r('app.float.log_display_area_min_height') + }) + } + } +} + +@Component +export struct CardContainer { + @Prop title: ResourceStr | null = null; + @Prop content: ResourceStr | null = null; + cardType: CardType = CardType.isCase; + hideTitle: boolean = false; + @BuilderParam child: () => void; + + aboutToAppear(): void { + if (this.title == null && !this.hideTitle) { + if (this.cardType === CardType.isCase) { + this.title = $r('app.string.case_description') + } else if (this.cardType === CardType.isLog) { + this.title = $r('app.string.log_display_area') + } else if (this.cardType === CardType.isCode) { + this.title = $r('app.string.code_sample') + } + } + } + + build() { + Column() { + if (!this.hideTitle) { + Text(this.title) + .width(PageConstants.FULL_WIDTH) + .fontWeight(FontWeight.Bold) + .fontSize(this.cardType === CardType.isCase ? $r('app.float.font_lg') : $r('app.float.font_md')) + .margin({ bottom: $r('app.float.vp_8') }); + } + Scroll() { + Text(this.content ?? $r('app.string.log_display_placeholder')) { + this.child?.() + }.attributeModifier(new TextStyles(this.cardType)) + } + .constraintSize({ maxHeight: $r('app.float.log_display_area_max_height') }) + .width(PageConstants.FULL_WIDTH) + .backgroundColor(this.cardType !== CardType.isCase ? '#0C000000' : null) + .borderRadius(this.cardType !== CardType.isCase ? $r('app.float.vp_16') : null) + .nestedScroll({ + scrollForward: NestedScrollMode.SELF_FIRST, + scrollBackward: NestedScrollMode.SELF_FIRST + }) + } + .width(PageConstants.FULL_WIDTH) + .alignItems(HorizontalAlign.Start) + .margin({ bottom: $r('app.float.vp_8') }) + } +} \ No newline at end of file diff --git a/entry/src/main/ets/common/components/CellComponent.ets b/entry/src/main/ets/common/components/CellComponent.ets index 904cb99..81bc9f8 100644 --- a/entry/src/main/ets/common/components/CellComponent.ets +++ b/entry/src/main/ets/common/components/CellComponent.ets @@ -53,7 +53,7 @@ export struct Cell { if (this.isLink) { Row() { if (this.hasMore) { - Text('更多') + Text($r('app.string.more')) .fontSize($r('app.float.font_sm')) .fontColor($r('app.color.text_secondary')) .margin({ right: '5vp' }) diff --git a/entry/src/main/ets/common/components/CaseDescriptor.ets b/entry/src/main/ets/common/components/LayoutContainer.ets similarity index 41% rename from entry/src/main/ets/common/components/CaseDescriptor.ets rename to entry/src/main/ets/common/components/LayoutContainer.ets index b5c8a77..1ad8b50 100644 --- a/entry/src/main/ets/common/components/CaseDescriptor.ets +++ b/entry/src/main/ets/common/components/LayoutContainer.ets @@ -12,35 +12,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { PageConstants } from '../constants/PageConstant'; + +import { PageConstants } from "../constants/PageConstant"; +import { BaseContainerStyles } from "../styles/BaseContentStyles"; +import { NavBar } from "./NavBar" @Component -export struct CaseDescriptor { - title: ResourceStr = $r('app.string.case_description'); - @Require desc: ResourceStr = ''; +export struct LayoutContainer { + @Prop @Require title: ResourceStr; + @BuilderParam child: () => void build() { - Column({ space: PageConstants.CASE_DESCRIPTOR_SPACE }) { - Text(this.title) - .fontWeight(FontWeight.Bold) - .fontSize($r('app.float.font_lg')) - .margin({ top: $r('app.float.title_margin_top'), bottom: $r('app.float.vp_2') }); + Column() { + NavBar({ title: this.title }) Scroll() { - Text(this.desc) - .lineHeight($r('app.float.desc_line_height')) - .wordBreak(WordBreak.BREAK_ALL) - .textAlign(TextAlign.JUSTIFY) - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - }.constraintSize({ - maxHeight: 230 + Column({ space: PageConstants.CASE_DESCRIPTOR_SPACE }) { + this.child() + } + .constraintSize({ minHeight: PageConstants.FULL_HEIGHT }) + } + .padding({ + top: $r('app.float.vp_8'), + left: $r('app.float.vp_16'), + right: $r('app.float.vp_16'), }) - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - bottom: $r('app.float.vp_8') - }) - .alignItems(HorizontalAlign.Start); + .layoutWeight(1) + .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]); + }.attributeModifier(new BaseContainerStyles()) } } \ No newline at end of file diff --git a/entry/src/main/ets/common/components/LogContainer.ets b/entry/src/main/ets/common/components/LogContainer.ets deleted file mode 100644 index 5706118..0000000 --- a/entry/src/main/ets/common/components/LogContainer.ets +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2024-2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { PageConstants } from '../constants/PageConstant'; - -@Component -export struct LogContainer { - @Prop logString: ResourceStr; - private controller: TextAreaController = new TextAreaController(); - - build() { - Column({ space: PageConstants.LOG_DISPLAY_AREA_COLUMN_SPACE }) { - Text($r('app.string.log_display_area')) - .margin({ - top: $r('app.float.log_display_area_margin_top'), - bottom: $r('app.float.log_display_area_margin_bottom') - }) - .fontWeight(FontWeight.Bold) - .fontColor($r('app.color.text_primary')) - .fontSize($r('app.float.font_lg')); - Scroll() { - TextArea({ - text: $$this.logString, - placeholder: $r('app.string.log_display_placeholder'), - controller: this.controller - }) - .enabled(PageConstants.TEXTAREA_DISABLED) - .borderRadius($r('app.float.vp_16')) - .lineHeight($r('app.float.log_display_area_line_height')) - .constraintSize({ - minHeight: $r('app.float.log_display_area_min_height') - }); - }.constraintSize({ - maxHeight: $r('app.float.log_display_area_max_height') - }).borderRadius($r('app.float.vp_16')); - }.margin($r('app.float.log_display_area_margin')) - .alignItems(HorizontalAlign.Start); - } -} \ No newline at end of file diff --git a/entry/src/main/ets/common/components/NavBar.ets b/entry/src/main/ets/common/components/NavBar.ets index 0785f4b..c1bb73c 100644 --- a/entry/src/main/ets/common/components/NavBar.ets +++ b/entry/src/main/ets/common/components/NavBar.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -14,6 +14,7 @@ */ import { HMRouterMgr } from "@hadss/hmrouter"; +import { PageConstants } from "../constants/PageConstant"; @Component export struct NavBar { @@ -21,7 +22,6 @@ export struct NavBar { private hideBackBtn: boolean = false; private backFunction?: () => void; - build() { Row() { if (!this.hideBackBtn) { @@ -42,10 +42,12 @@ export struct NavBar { .fontWeight(FontWeight.Bold) .fontColor($r('app.color.text_primary')) .fontSize($r('app.float.font_title')); - }.height($r('app.float.navBar_title_height')) - .margin({ + } + .height($r('app.float.navBar_title_height')) + .width(PageConstants.FULL_WIDTH) + .padding({ left: $r('app.float.vp_16'), - right: $r('app.float.vp_16') - }); + right: $r('app.float.vp_16'), + }) } } \ No newline at end of file diff --git a/entry/src/main/ets/common/constants/CodeExample.ets b/entry/src/main/ets/common/constants/CodeExample.ets new file mode 100644 index 0000000..2eea95c --- /dev/null +++ b/entry/src/main/ets/common/constants/CodeExample.ets @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export class CodeExample { + static DEFINE_THE_SERIALIZATION_CLASS = `@Serializable({ generateSendable: true })\n` + + `export class PersonWithSendable {\n` + + ` public name: string;\n` + + ` public age: number;\n` + + ` public sex: string;\n` + + ` public scores: Array;\n` + + ` constructor(name: string, age: number, sex: string, scores: Array) {\n` + + ` this.name = name;\n` + + ` this.age = age;\n` + + ` this.sex = sex;\n` + + ` this.scores = scores;\n` + + ` }\n` + + `}` + static CROSS_THREAD_USAGE = `// Define sub thread execution function\n` + + `@Concurrent\n` + + `function childThreadTask() {\n` + + ` const person = new PersonWithSendable('John', 20, 'man', [1, 2, 3]);\n` + + ` return (person as object as ITSerializable).toSendable()\n` + + `}\n\n` + + `// Execute child thread function, get return value, and serialize\n` + + `const task: taskpool.Task = new taskpool.Task(childThreadTask);\n` + + `const data = await taskpool.execute(task);\n` + + `const person = TJSON.toOrigin(data);\n` + + `const personStr = TJSON.toString(person, PersonWithSendable);` +} \ No newline at end of file diff --git a/entry/src/main/ets/common/constants/TabsMenuConstants.ets b/entry/src/main/ets/common/constants/MenuConstants.ets similarity index 64% rename from entry/src/main/ets/common/constants/TabsMenuConstants.ets rename to entry/src/main/ets/common/constants/MenuConstants.ets index 5598b81..09a5870 100644 --- a/entry/src/main/ets/common/constants/TabsMenuConstants.ets +++ b/entry/src/main/ets/common/constants/MenuConstants.ets @@ -16,29 +16,27 @@ import { PageRouteConstants } from './PageRouteConstants'; import { MainPageListItem } from '../components/interface/MainPageListItem'; -export class TabsMenuConstants { - // ========== 高阶使用 ========== +export class MenuConstants { static HIGH_LEVEL_USE_PAGE_LIST: MainPageListItem[] = [ - { - title: $r('app.string.with_sendable_serialization'), + title: $r('app.string.with_sendable_title'), pathInfo: { pageUrl: PageRouteConstants.WITH_SENDABLE_PAGE } }, { - title: $r('app.string.network_data_interaction_case'), - pathInfo: { pageUrl: PageRouteConstants.NETWORK_DATA_INTERACTION_PAGE } + title: $r('app.string.network_request_title'), + pathInfo: { pageUrl: PageRouteConstants.NETWORK_REQUEST_PAGE } }, { - title: $r('app.string.comprehensive_use_case'), - pathInfo: { pageUrl: PageRouteConstants.COMPREHENSIVE_USE_PAGE } + title: $r('app.string.network_and_sendable_title'), + pathInfo: { pageUrl: PageRouteConstants.NETWORK_AND_SENDABLE_PAGE } }, { - title: $r('app.string.stream_data_decode'), + title: $r('app.string.big_json_decode_title'), pathInfo: { pageUrl: PageRouteConstants.BIG_JSONFILE_DECODE_PAGE } }, { - title: $r('app.string.lazy_load_JsonNode'), - pathInfo: { pageUrl: PageRouteConstants.LAZY_LOAD_JSONNODE_PAGE } + title: $r('app.string.lazy_load_title'), + pathInfo: { pageUrl: PageRouteConstants.LAZY_LOAD_JSON_NODE_PAGE } } ]; } \ No newline at end of file diff --git a/entry/src/main/ets/common/constants/NavigationConstants.ets b/entry/src/main/ets/common/constants/NavigationConstants.ets index 83a300e..7e5edf1 100644 --- a/entry/src/main/ets/common/constants/NavigationConstants.ets +++ b/entry/src/main/ets/common/constants/NavigationConstants.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -14,6 +14,6 @@ */ export class NavigationConstants { - // ========== 主导航ID ========== + // ========== Main Navigation ID ========== static readonly MAIN_NAVIGATION_ID: string = 'MAIN_NAVIGATION_ID'; -} \ No newline at end of file +} \ No newline at end of file diff --git a/entry/src/main/ets/common/constants/PageConstant.ets b/entry/src/main/ets/common/constants/PageConstant.ets index 5358a5b..25c6c9a 100644 --- a/entry/src/main/ets/common/constants/PageConstant.ets +++ b/entry/src/main/ets/common/constants/PageConstant.ets @@ -18,10 +18,6 @@ export class PageConstants { * Full screen width. */ static readonly FULL_WIDTH: string = '100%'; - /** - * Half screen width. - */ - static readonly HALF_SCREEN_WIDTH: string = '50%'; /** * Full screen height. */ @@ -58,30 +54,6 @@ export class PageConstants { * Crop the sub components of the current component */ static readonly CELL_GROUP_CLIP: boolean = true; - /** - * Vertical splitter. - */ - static readonly IS_VERTICAL_DIVIDER: boolean = true; - /** - * Divider stroke width. - */ - static readonly DIVIDER_STROKE_WIDTH: number = 1; - /** - * Exit text width. - */ - static readonly EXIT_TEXT_WIDTH: string = '49%'; - /** - * BuildDialog column width. - */ - static readonly BUILD_DIALOG_COLUMN_WIDTH: string = '90%'; - /** - * Log display area column space. - */ - static readonly LOG_DISPLAY_AREA_COLUMN_SPACE: number = 12; - /** - * TextArea cannot be edited. - */ - static readonly TEXTAREA_DISABLED: boolean = false; /** * Case descriptor space */ diff --git a/entry/src/main/ets/common/constants/PageRouteConstants.ets b/entry/src/main/ets/common/constants/PageRouteConstants.ets index 1009b36..eaa852b 100644 --- a/entry/src/main/ets/common/constants/PageRouteConstants.ets +++ b/entry/src/main/ets/common/constants/PageRouteConstants.ets @@ -14,12 +14,10 @@ */ export class PageRouteConstants { - // ========== 主页面路由 ========== static readonly MAIN_PAGE: string = 'MainPage'; - // ========== 高阶用法路由 ========== static readonly WITH_SENDABLE_PAGE: string = 'withSendablePage'; - static readonly NETWORK_DATA_INTERACTION_PAGE: string = 'networkDataInteractionPage'; - static readonly COMPREHENSIVE_USE_PAGE: string = 'comprehensiveUsePage'; + static readonly NETWORK_REQUEST_PAGE: string = 'networkRequestPage'; + static readonly NETWORK_AND_SENDABLE_PAGE: string = 'networkAndSendablePage'; static readonly BIG_JSONFILE_DECODE_PAGE: string = 'bigJsonFileDecodePage'; - static readonly LAZY_LOAD_JSONNODE_PAGE: string = 'lazyLoadJsonnodePage'; + static readonly LAZY_LOAD_JSON_NODE_PAGE: string = 'lazyLoadJsonNodePage'; } \ No newline at end of file diff --git a/entry/src/main/ets/common/index.ets b/entry/src/main/ets/common/index.ets index e40ff97..bf92eeb 100644 --- a/entry/src/main/ets/common/index.ets +++ b/entry/src/main/ets/common/index.ets @@ -1,21 +1,34 @@ -// export { PageRouteConstants } from './constants/PageRouteConstants'; +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ export { NavigationConstants } from './constants/NavigationConstants'; export { PageConstants } from './constants/PageConstant'; -export { CaseDescriptor } from './components/CaseDescriptor'; +export { CardContainer, CardType } from './components/CardContainer'; export { Cell } from './components/CellComponent'; export { CellGroup } from './components/CellGroupComponent'; -export { LogContainer } from './components/LogContainer'; +export { MainPageListItem } from './components/interface/MainPageListItem'; -export { NavBar } from './components/NavBar'; +export { ButtonStyles } from './styles/ButtonStyles'; -export { MainPageListItem } from './components/interface/MainPageListItem'; +export { LayoutContainer } from './components/LayoutContainer'; export { BaseContainerStyles } from './styles/BaseContentStyles'; -export { ButtonStyles } from './styles/ButtonStyles'; \ No newline at end of file +export { CodeExample } from './constants/CodeExample' diff --git a/entry/src/main/ets/common/styles/ButtonStyles.ets b/entry/src/main/ets/common/styles/ButtonStyles.ets index c868e67..9b94285 100644 --- a/entry/src/main/ets/common/styles/ButtonStyles.ets +++ b/entry/src/main/ets/common/styles/ButtonStyles.ets @@ -14,15 +14,15 @@ */ import { AttributeUpdater } from '@kit.ArkUI'; +import { PageConstants } from '../constants/PageConstant'; export class ButtonStyles extends AttributeUpdater { initializeModifier(instance: ButtonAttribute): void { instance.height($r('app.float.vp_40')); + instance.width(PageConstants.FULL_WIDTH) instance.margin({ left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - top: $r('app.float.vp_04'), - bottom: $r('app.float.vp_16'), + right: $r('app.float.vp_16') }); } } \ No newline at end of file diff --git a/entry/src/main/ets/features/bigJSONFileDecodeCase/BigJsonFileDecodePage.ets b/entry/src/main/ets/features/bigJSONFileDecodeCase/BigJsonFileDecodePage.ets deleted file mode 100644 index 7e1d019..0000000 --- a/entry/src/main/ets/features/bigJSONFileDecodeCase/BigJsonFileDecodePage.ets +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { HMRouter } from '@hadss/hmrouter'; -import { TJSON } from '@hadss/turbo-trans-json'; -import { CaseDescriptor, PageConstants } from '../../common'; -import promptAction from '@ohos.promptAction'; -import { systemDateTime } from '@kit.BasicServicesKit'; -import util from '@ohos.util'; -import { PageRouteConstants } from '../../common/constants/PageRouteConstants'; - -@HMRouter({ pageUrl: PageRouteConstants.BIG_JSONFILE_DECODE_PAGE }) -@Component -export default struct BigJsonFileDecodePage { - private desc: ResourceStr = $r('app.string.big_jsonfile_decode_desc'); - private jsonFiles: string[] = [ - // JSON文件下载地址 https://github.com/zemirco/sf-city-lots-json - 'citylots.json' - ]; - private currentJsonFile: string = ''; - private json: Uint8Array | null = null; - // 添加状态变量 - @State duration: number = 0; - @State fileSize: number = 0; - @State isParsing: boolean = false; - @State result: string = '等待选择文件...'; - @State success: boolean = false; - @State previewText: string = '请先加载文件...'; - @State logContent: string = '显示部分解析结果...'; - - // 添加提取预览文本的方法 - private extractPreviewText() { - if (!this.json || this.json.byteLength === 0) { - this.previewText = '文件内容为空'; - return; - } - - try { - const decoder = util.TextDecoder.create('utf-8'); - if (this.json.length <= 150) { - this.previewText = decoder.decode(this.json); - } else { - this.previewText = decoder.decode(this.json.slice(0, 150)) + '...'; - } - } catch (error) { - this.previewText = '预览解析失败'; - } - } - - // 切换JSON文件 - private changeJsonType(index: number) { - const jsonFile = this.jsonFiles[index]; - this.currentJsonFile = jsonFile; - this.success = false; - this.duration = 0; - this.previewText = '加载中...'; - try { - const context = this.getUIContext().getHostContext(); - if (!context) { - this.previewText = 'context获取失败' - return - } - this.json = context.resourceManager.getRawFileContentSync(this.currentJsonFile); - this.fileSize = this.json.byteLength / 1024 / 1024; - this.result = `文件加载成功,大小: ${this.fileSize.toFixed(2)} MB,等待解析...`; - this.extractPreviewText(); - promptAction.showToast({ - message: `已加载文件${jsonFile}`, - duration: 1000 - }); - } catch (e) { - this.previewText = '加载失败,文件路径不存在'; - promptAction.showToast({ - message: this.previewText, - duration: 1000 - }); - } - } - - // 生成日志内容的方法 - private generateLogContent(obj: ESObject, value: string = '', depth: number = 0): string { - if (typeof obj === null || obj === undefined) { - return '解析结果为空'; - } - let log = `============ 第${depth}层 ============\n`; - if (Array.isArray(obj)) { - log += `当前结构为数组,元素个数为: ${obj.length}\n`; - log += this.generateLogContent(obj[0], '[0]', depth + 1); - return log; - } else if (typeof obj === 'object') { - const keys = Object.keys(obj); - log += `当前结构为对象,Key数量为: ${keys.length}\n`; - log += '展示前三个{Key: Value}:\n'; - const count = Math.min(3, keys.length); - for (let i = 0; i < count; i++) { - const key = keys[i]; - let value: ESObject = obj[key]; - log += `{${key}: `; - - if (Array.isArray(value)) { - log += `Array[${value.length}]}\n`; - } else if (value && typeof value === 'object') { - log += `Object{${Object.keys(value).length}}}\n`; - } else if (value && typeof value === 'string') { - log += `"${value}"}\n`; - } else { - log += `${value}}\n`; - } - } - - if (keys.length > 0) { - const firstKey = keys[0]; - let firstValue: ESObject = obj[firstKey]; - - log += this.exploreDeepValue(firstValue, value + '.' + firstKey, depth + 1); - } - return log; - } - return `解析结果为基本类型:${obj.toString()}`; - } - - // 递归探索对象深层值 - private exploreDeepValue(value: ESObject, path: string, depth: number): string { - let log = `============ 第${depth}层 ============\n` + '深搜到的第一个最底层元素:\n'; - ; - if (depth > 30) { // 防止无限递归 - return log + `${path}: [已达到最大探索深度]\n`; - } - - if (value === null || value === undefined) { - return log + `{${path}: ${value}}\n`; - } - - if (typeof value !== 'object') { - if (typeof value === 'string') { - return log + `{${path}: "${value}"}\n`; - } else { - return log + `{${path}: ${value}}\n`; - } - } - - if (Array.isArray(value)) { - if (value.length === 0) { - return log + `{${path}: [] (空数组)}\n`; - } - return this.exploreDeepValue(value[0], path + '.' + '[0]', depth + 1); - } - - const keys = Object.keys(value); - if (keys.length === 0) { - return log + `{${path}: {} (空对象)}\n`; - } - - const firstKey = keys[0]; - return this.exploreDeepValue(value[firstKey], path + '.' + firstKey, depth + 1); - } - - build() { - Scroll() { // 外层加 Scroll,防止超出页面显示不完整 - Column() { - // 1:标题 + 介绍部分 - CaseDescriptor({ desc: this.desc }); - - // 2:文件选择和展示区 - Column() { - Text() { - ForEach(this.jsonFiles, (jsonFile: string, index: number) => { - Span(jsonFile) - .fontColor($r('app.color.text_blue')) - .onClick(() => this.changeJsonType(index)) - .width('95%'); - }) - - } - .lineHeight($r('app.float.desc_line_height')) - .wordBreak(WordBreak.BREAK_ALL) - .textAlign(TextAlign.JUSTIFY) - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - - Scroll() { - TextArea({ - text: this.previewText, - placeholder: $r('app.string.log_display_placeholder'), - }) - .enabled(PageConstants.TEXTAREA_DISABLED) - .borderRadius($r('app.float.vp_16')) - .lineHeight($r('app.float.log_display_area_line_height')) - .constraintSize({ - minHeight: $r('app.float.log_display_area_min_height') - }); - }.constraintSize({ - maxHeight: 150 - }).borderRadius($r('app.float.vp_16')); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - bottom: $r('app.float.vp_8') - }) - .alignItems(HorizontalAlign.Start); - - // 3:日志展示区 - Column() { - Text('执行结果') - .fontWeight(FontWeight.Bold) - .fontSize($r('app.float.font_lg')) - .margin({ bottom: $r('app.float.vp_2') }); - - Row() { - Text('文件大小:') - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - Text(`${this.fileSize.toFixed(2)} MB`) - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_blue')) - .margin({ left: 8 }); - } - .margin({ bottom: 2 }); - - Row() { - Text('解析状态:') - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - Text(this.isParsing ? '解析中...' : (this.success ? '成功' : '未开始')) - .fontSize($r('app.float.font_md')) - .fontColor(this.isParsing ? Color.Red : - (this.success ? Color.Green : $r('app.color.text_secondary'))) - .margin({ left: 8 }); - } - .margin({ bottom: 2 }); - - // 显示解析耗时 - Row() { - Text('解析耗时:') - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - Text(`${this.duration.toFixed(2)} ms`) - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_blue')) - .margin({ left: 8 }); - } - .margin({ bottom: 2 }); - - // 显示解析速度 - Row() { - Text('解析速度:') - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - Text(this.duration > 0 ? `${(this.fileSize * 1000 / this.duration).toFixed(2)} MB/s` : '--') - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_blue')) - .margin({ left: 8 }); - } - .margin({ bottom: 2 }); - - // 结果显示区域 - Text(this.result) - .fontSize($r('app.float.font_md')) - .fontColor(this.success ? Color.Green : $r('app.color.text_secondary')) - .textAlign(TextAlign.Start) - .width('100%'); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - }) - .alignItems(HorizontalAlign.Start) - .flexGrow(1); - - // 4:方法执行区 - Column({ space: PageConstants.LOG_DISPLAY_AREA_COLUMN_SPACE }) { - Text($r('app.string.log_display_area')) - .margin({ - top: $r('app.float.log_display_area_margin_top'), - bottom: $r('app.float.log_display_area_margin_bottom') - }) - .fontWeight(FontWeight.Bold) - .fontColor($r('app.color.text_primary')) - .fontSize($r('app.float.font_lg')); - Scroll() { - TextArea({ - text: this.logContent, - placeholder: $r('app.string.log_display_placeholder'), - }) - .enabled(PageConstants.TEXTAREA_DISABLED) - .borderRadius($r('app.float.vp_16')) - .lineHeight($r('app.float.log_display_area_line_height')) - .constraintSize({ - minHeight: $r('app.float.log_display_area_min_height') - }); - } - .constraintSize({ - maxHeight: 200 - }) - .borderRadius($r('app.float.vp_16')); - - Button('文件解析', { type: ButtonType.Capsule }) - .width('95%') - .height($r('app.float.cell_min_height')) - .fontColor($r('app.color.color_white')) - .backgroundColor(this.isParsing ? Color.Gray : $r('app.color.text_blue')) - .margin({ bottom: 15 }) - .stateEffect(!this.isParsing) - .onClick(async () => { - if (this.isParsing || this.json === null) { - promptAction.showToast({ - message: '请先点击任意文件加载内容', - duration: 1000 - }); - return; - } - - this.isParsing = true; - this.result = '正在解析JSON文件...'; - - try { - // 记录开始时间 - const startTime = systemDateTime.getTime(true); - - // 执行解析 - let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); - let obj: ESObject = await jsonNode.toPlainObjectAsync(); - this.json = null; - - // 计算耗时 - const endTime = systemDateTime.getTime(true); - this.duration = (endTime - startTime) / 1e6; - - // 生成日志内容 - this.logContent = this.generateLogContent(obj); - - // 更新结果 - this.success = true; - this.result = `共解析${Object.keys(obj).length}个顶层属性,耗时${this.duration.toFixed(2)}毫秒`; - - promptAction.showToast({ - message: 'JSON文件解析完成', - duration: 1000 - }); - } catch (e) { - this.success = false; - this.result = `JSON文件解析失败: ${e.message || '未知错误'}`; - this.logContent = `解析失败: ${e.message || '未知错误'}`; - promptAction.showToast({ - message: 'JSON文件解析失败', - duration: 1000 - }); - } finally { - this.isParsing = false; - } - }); - } - .margin($r('app.float.log_display_area_margin')) - .alignItems(HorizontalAlign.Start); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - bottom: $r('app.float.vp_8') - }); - }; - } -} \ No newline at end of file diff --git a/entry/src/main/ets/features/lazyLoadJsonNodeCase/LazyLoadJsonNodePage.ets b/entry/src/main/ets/features/lazyLoadJsonNodeCase/LazyLoadJsonNodePage.ets deleted file mode 100644 index b9914ed..0000000 --- a/entry/src/main/ets/features/lazyLoadJsonNodeCase/LazyLoadJsonNodePage.ets +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { HMRouter } from '@hadss/hmrouter'; -import { CaseDescriptor, LogContainer, PageConstants } from '../../common'; -import { buffer } from '@kit.ArkTS'; -import { JsonNode, JsonNodeType, TJSON } from '@hadss/turbo-trans-json'; -import promptAction from '@ohos.promptAction'; -import { PageRouteConstants } from '../../common/constants/PageRouteConstants'; - -class JsonMethod { - name: string = ''; - label: string = ''; - requiresParam: boolean = false; - paramPlaceholder: string = ''; - supportedTypes: JsonNodeType[] = []; -} - -// JSON类型选项 -interface JsonTypeOption { - name: string; - label: string; - value: string; - type: JsonNodeType; -} - -@HMRouter({ pageUrl: PageRouteConstants.LAZY_LOAD_JSONNODE_PAGE }) -@Component -export default struct LazyLoadJsonNodePage { - private desc: ResourceStr = $r('app.string.lazy_load_jsonnode_desc'); - @State private jsonObjectStr: string = ''; - @State private jsonArrayStr: string = ''; - @State private jsonPrimitiveStr: string = ''; - @State private jsonNullStr: string = ''; - @State private currentJsonStr: string = ''; - @State private currentJsonType: string = 'object'; - @State private jsonNode: JsonNode | null = null; - @State private currentJsonNodeType: JsonNodeType = JsonNodeType.JSON_NULL; - @State private selectedMethod: string = 'at'; - @State private methodParam: string = ''; - @State private executionResult: string = '执行结果将显示在这里'; - @State private showParamInput: boolean = true; - // JSON类型选项 - private jsonTypeOptions: JsonTypeOption[] = [ - { - name: 'object', - label: 'JsonObject', - value: 'object', - type: JsonNodeType.JSON_OBJECT - }, - { - name: 'array', - label: 'JsonArray', - value: 'array', - type: JsonNodeType.JSON_ARRAY - }, - { - name: 'primitive', - label: 'JsonPrimitive', - value: 'primitive', - type: JsonNodeType.JSON_PRIMITIVE - }, - { - name: 'null', - label: 'JsonNull', - value: 'null', - type: JsonNodeType.JSON_NULL - } - ]; - private allMethods: Array = [ - { - name: 'at', - label: 'at #JsonPointer查询#', - requiresParam: true, - paramPlaceholder: '输入JsonPointer (如: /address/city)', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] - }, - { - name: 'exists', - label: 'exists #检查是否存在值#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, - JsonNodeType.JSON_NULL] - }, - { - name: 'jsonType', - label: 'jsonType #获取类型#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, - JsonNodeType.JSON_NULL] - }, - { - name: 'toString', - label: 'toString #转换为JSON字符串#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, - JsonNodeType.JSON_NULL] - }, - { - name: 'has', - label: 'has #判断键存在#', - requiresParam: true, - paramPlaceholder: '输入键名', - supportedTypes: [JsonNodeType.JSON_OBJECT] - }, - { - name: 'getCapacity', - label: 'getCapacity #获取数组元素个数#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_ARRAY] - }, - { - name: 'get', - label: 'get #获取键或索引对应的值#', - requiresParam: true, - paramPlaceholder: '输入键名或索引', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] - }, - { - name: 'keys', - label: 'keys #获取所有键#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT] - }, - { - name: 'values', - label: 'values #获取所有值#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] - }, - { - name: 'entries', - label: 'entries #获取所有键-值对#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] - }, - { - name: 'boolean', - label: 'boolean #获取布尔值#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_PRIMITIVE] - }, - { - name: 'number', - label: 'number #获取数值#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_PRIMITIVE] - }, - { - name: 'string', - label: 'string #获取字符串#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_PRIMITIVE] - }, - { - name: 'bigint', - label: 'bigint #获取大数#', - requiresParam: false, - paramPlaceholder: '', - supportedTypes: [JsonNodeType.JSON_PRIMITIVE] - }, - ]; - - // 根据当前JsonNode类型过滤后的方法列表 - private filteredMethods(): Array { - if (!this.jsonNode) { - return []; - } - return this.allMethods.filter(method => method.supportedTypes.includes(this.currentJsonNodeType)); - } - - aboutToAppear(): void { - // 初始化各种JSON类型示例 - this.jsonObjectStr = '{\n' + - '\t\t"name": "kennen",\n' + - '\t\t"age": 25,\n' + - '\t\t"address": {\n' + - '\t\t\t"city": "Wuhan"\n' + - '\t\t}\n' + - '}'; - - this.jsonArrayStr = '[\n' + - '\t\t"apple",\n' + - '\t\t1234,\n' + - '\t\t{\n' + - '\t\t\t"color": "orange"\n' + - '\t\t}\n' + - ']'; - - this.jsonPrimitiveStr = '"Hello, World!"'; - this.jsonNullStr = 'null'; - - // 默认使用JSON对象 - this.currentJsonStr = this.jsonObjectStr; - this.jsonNode = TJSON.toJsonNodeFromBuffer(buffer.from(this.currentJsonStr).buffer); - - if (this.jsonNode) { - this.currentJsonNodeType = this.jsonNode.jsonType(); - } - - // 设置默认选中的方法为当前可用的第一个方法 - if (this.filteredMethods().length > 0) { - this.selectedMethod = this.filteredMethods()[0].name; - this.showParamInput = this.filteredMethods()[0].requiresParam; - } - } - - // 切换JSON类型 - private changeJsonType(index: number) { - const selectedType = this.jsonTypeOptions[index]; - this.currentJsonType = selectedType.value; - - switch (this.currentJsonType) { - case 'object': - this.currentJsonStr = this.jsonObjectStr; - break; - case 'array': - this.currentJsonStr = this.jsonArrayStr; - break; - case 'primitive': - this.currentJsonStr = this.jsonPrimitiveStr; - break; - case 'null': - this.currentJsonStr = this.jsonNullStr; - break; - } - - this.jsonNode = TJSON.toJsonNodeFromString(this.currentJsonStr); - - if (this.jsonNode) { - this.currentJsonNodeType = this.jsonNode.jsonType(); - } - - // 重置执行结果 - this.executionResult = '执行结果将显示在这里'; - - // 更新选中的方法 - if (this.filteredMethods().length > 0) { - this.selectedMethod = this.filteredMethods()[0].name; - this.showParamInput = this.filteredMethods()[0].requiresParam; - } - - promptAction.showToast({ - message: `已切换到${this.jsonTypeOptions[index].label}`, - duration: 1000 - }); - } - - // 处理方法选择变化 - private handleMethodChange(idx: number) { - const method = this.filteredMethods()[idx]; - this.selectedMethod = method.name; - this.showParamInput = method.requiresParam; - } - - // 执行选择的方法 - private executeMethod() { - if (!this.jsonNode) { - return; - } - - try { - let result: ESObject; - - switch (this.selectedMethod) { - case 'at': - result = this.jsonNode.at(this.methodParam); - this.executionResult = this.formatResult(result); - break; - - case 'exists': - result = this.jsonNode.exists(); - this.executionResult = `${result}`; - break; - - case 'jsonPrimitive': - result = this.jsonNode.jsonPrimitive(); - this.executionResult = this.formatResult(result); - break; - - case 'jsonObject': - result = this.jsonNode.jsonObject(); - this.executionResult = this.formatResult(result); - break; - - case 'jsonArray': - result = this.jsonNode.jsonArray(); - this.executionResult = this.formatResult(result); - break; - - case 'jsonNull': - result = this.jsonNode.jsonNull(); - this.executionResult = this.formatResult(result); - break; - - case 'jsonType': - result = this.jsonNode.jsonType(); - this.executionResult = `${this.getJsonNodeTypeName(result)}`; - break; - - case 'toString': - result = this.jsonNode.toString(); - this.executionResult = `${result}`; - break; - - case 'has': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { - const obj = this.jsonNode.jsonObject(); - result = obj.has(this.methodParam); - this.executionResult = `has("${this.methodParam}"): ${result}`; - } else { - this.executionResult = 'has方法只能在JsonObject上使用'; - } - break; - - case 'getCapacity': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { - const obj = this.jsonNode.jsonArray(); - result = obj.getCapacity(); - this.executionResult = `${result}`; - } else { - this.executionResult = 'getCapacity方法只能在JsonArray上使用'; - } - break; - - case 'get': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { - const obj = this.jsonNode.jsonObject(); - result = obj.get(this.methodParam); - this.executionResult = this.formatResult(result); - } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { - const arr = this.jsonNode.jsonArray(); - const index = parseInt(this.methodParam); - if (isNaN(index)) { - this.executionResult = '参数必须是数字索引'; - } else { - result = arr.get(index); - this.executionResult = this.formatResult(result); - } - } else { - this.executionResult = 'get方法只能在JsonObject或JsonArray上使用'; - } - break; - - case 'keys': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { - const obj = this.jsonNode.jsonObject(); - const keys = obj.keys(); - this.executionResult = `${Array.from(keys).join('\n')}`; - } else { - this.executionResult = 'keys方法只能在JsonObject上使用'; - } - break; - - case 'values': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { - const obj = this.jsonNode.jsonObject(); - const values = obj.values(); - this.executionResult = `${Array.from(values).map(v => this.formatResult(v)).join('\n')}`; - } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { - const obj = this.jsonNode.jsonArray(); - const values = obj.values(); - this.executionResult = `${Array.from(values).map(v => this.formatResult(v)).join('\n')}`; - } else { - this.executionResult = 'values方法只能在JsonObject和JsonArray上使用'; - } - break; - - case 'entries': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { - const obj = this.jsonNode.jsonObject(); - const entries = Array.from(obj.entries()); - this.executionResult = entries.map((entry) => `${entry[0]}: ${this.formatResult(entry[1])}`).join('\n'); - } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { - const obj = this.jsonNode.jsonArray(); - const entries = Array.from(obj.entries()); - this.executionResult = entries.map((entry) => `${entry[0]}: ${this.formatResult(entry[1])}`).join('\n'); - } else { - this.executionResult = 'entries方法只能在JsonObject和JsonArray上使用'; - } - break; - - case 'boolean': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { - const primitive = this.jsonNode.jsonPrimitive(); - result = primitive.booleanOrThrow(); - this.executionResult = `${result}`; - } else { - this.executionResult = 'boolean方法只能在布尔类型的JsonPrimitive上使用'; - } - break; - - case 'number': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { - const primitive = this.jsonNode.jsonPrimitive(); - result = primitive.numberOrThrow(); - this.executionResult = `${result}`; - } else { - this.executionResult = 'number方法只能在数字类型的JsonPrimitive上使用'; - } - break; - - case 'string': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { - const primitive = this.jsonNode.jsonPrimitive(); - result = primitive.stringOrThrow(); - this.executionResult = `${result}`; - } else { - this.executionResult = 'string方法只能在字符串类型的JsonPrimitive上使用'; - } - break; - - case 'bigint': - if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { - const primitive = this.jsonNode.jsonPrimitive(); - result = primitive.bigintOrThrow(); - this.executionResult = `${result}`; - } else { - this.executionResult = 'bigint方法只能在字符串类型的JsonPrimitive上使用'; - } - break; - - default: - this.executionResult = '未知方法'; - } - - promptAction.showToast({ - message: '方法执行成功', - duration: 1000 - }); - } catch (error) { - this.executionResult = `执行错误: ${error.message}`; - promptAction.showToast({ - message: '方法执行失败', - duration: 2000 - }); - } - } - - // 格式化结果显示 - private formatResult(result: JsonNode): string { - if (result === null || result === undefined) { - return 'null'; - } - return result.toString(); - } - - // 获取JsonNode类型名称 - private getJsonNodeTypeName(type: JsonNodeType): string { - switch (type) { - case JsonNodeType.JSON_OBJECT: - return '对象(JsonObject)'; - case JsonNodeType.JSON_ARRAY: - return '数组(JsonArray)'; - case JsonNodeType.JSON_PRIMITIVE: - return '基础类型(JsonPrimitive)'; - case JsonNodeType.JSON_NULL: - return '空值(JsonNull)'; - default: - return '未知类型'; - } - } - - build() { - Scroll() { // 外层加 Scroll,防止超出页面显示不完整 - Column() { - // 1:标题 + 介绍部分 - CaseDescriptor({ desc: this.desc }); - - // 2:类型选择和展示区 - Column() { - Text() { - Span('JsonObject') - .fontColor($r('app.color.text_blue')) - .onClick(() => this.changeJsonType(0)); - - Span('|') - .fontColor($r('app.color.text_secondary')); - - Span('JsonArray') - .fontColor($r('app.color.text_blue')) - .onClick(() => this.changeJsonType(1)); - - Span('|') - .fontColor($r('app.color.text_secondary')); - - Span('JsonPrimitive') - .fontColor($r('app.color.text_blue')) - .onClick(() => this.changeJsonType(2)); - - Span('|') - .fontColor($r('app.color.text_secondary')); - - Span('JsonNull') - .fontColor($r('app.color.text_blue')) - .onClick(() => this.changeJsonType(3)); - } - .lineHeight($r('app.float.desc_line_height')) - .wordBreak(WordBreak.BREAK_ALL) - .textAlign(TextAlign.JUSTIFY) - .fontSize($r('app.float.font_md')) - .fontColor($r('app.color.text_secondary')); - - Scroll() { - TextArea({ - text: this.currentJsonStr, - placeholder: $r('app.string.log_display_placeholder'), - }) - .enabled(PageConstants.TEXTAREA_DISABLED) - .borderRadius($r('app.float.vp_16')) - .lineHeight($r('app.float.log_display_area_line_height')) - .constraintSize({ - minHeight: $r('app.float.log_display_area_min_height') - }); - }.constraintSize({ - maxHeight: $r('app.float.log_display_area_max_height') - }).borderRadius($r('app.float.vp_16')); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - }) - .alignItems(HorizontalAlign.Start); - - // 3:日志展示区 - LogContainer({ logString: this.executionResult }); - - // 4:方法执行区 - Column() { - Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) { - Text('选择方法:') - .fontSize(16) - .fontWeight(FontWeight.Medium) - .textAlign(TextAlign.Start) - .margin({ right: 12 }) - .flexShrink(0); - - Select(this.filteredMethods().map(m => { - return { value: m.label } as SelectOption; - })) - .value(this.selectedMethod) - .onSelect((index: number) => { - this.handleMethodChange(index); - }) - .flexGrow(1); - } - .width('95%') - .margin({ bottom: 10 }); - - if (this.showParamInput) { - TextInput({ - placeholder: this.filteredMethods().find(m => m.name === this.selectedMethod)?.paramPlaceholder || '输入参数' - }) - .placeholderColor(0x999999) - .width('95%') - .height(40) - .margin({ bottom: 10 }) - .onChange((value) => { - this.methodParam = value; - }); - } - - Button('执行方法', { type: ButtonType.Capsule }) - .width('95%') - .height($r('app.float.cell_min_height')) - .fontColor($r('app.color.color_white')) - .backgroundColor($r('app.color.text_blue')) - .margin({ bottom: 15 }) - .onClick(() => this.executeMethod()); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - bottom: $r('app.float.vp_8') - }) - .alignItems(HorizontalAlign.Start); - } - .margin({ - left: $r('app.float.vp_16'), - right: $r('app.float.vp_16'), - bottom: $r('app.float.vp_8') - }); - }; - } -} \ No newline at end of file diff --git a/entry/src/main/ets/features/networkAndSendableCase/NetworkAndSendablePage.ets b/entry/src/main/ets/features/networkAndSendableCase/NetworkAndSendablePage.ets deleted file mode 100644 index c5ec27c..0000000 --- a/entry/src/main/ets/features/networkAndSendableCase/NetworkAndSendablePage.ets +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { HMRouter } from '@hadss/hmrouter'; -import { ITSerializable, TJSON } from '@hadss/turbo-trans-json'; -import { LengthMetrics } from '@kit.ArkUI'; -import { BaseContainerStyles, CaseDescriptor, LogContainer, NavBar } from '../../common'; -import { TcpServerUtil } from '../../utils/NetworkUtil'; -import { Person } from '../../model/sendableCase/Person'; -import { PageRouteConstants } from '../../common/constants/PageRouteConstants'; -import { rcp } from '@kit.RemoteCommunicationKit'; -import { lang, taskpool } from '@kit.ArkTS'; - -@Concurrent -async function requestData(): Promise { - const session = rcp.createSession(); - const request = new rcp.Request('http://127.0.0.1:8080'); - const response: rcp.Response = await session.fetch(request) - if (response) { - const person = TJSON.fromBuffer(response.body, Person); - return (person as object as ITSerializable).toSendable(); - } - return undefined -} - -@HMRouter({ pageUrl: PageRouteConstants.COMPREHENSIVE_USE_PAGE }) -@Component -export default struct NetworkAndSendablePage { - private baseContainerStyles: BaseContainerStyles = new BaseContainerStyles(); - @State logString: string = ''; - - aboutToAppear(): void { - TcpServerUtil.create(); - } - - aboutToDisappear(): void { - TcpServerUtil.close(); - } - - async requestData() { - const task: taskpool.Task = new taskpool.Task(requestData); - const data = await taskpool.execute(task); - const person: Person = TJSON.toOrigin(data); - const personStr = TJSON.toString(person, Person); - this.logString = `跨线程网络请求的数据\n序列化: \n` + `sendableStr: ${personStr}\n` + - `反序列化: \n person.name: ${person.name}\n person.age: ${person.age}\n person.sex: ${person.sex}\n person.scores: ${person.scores}`; - } - - build() { - Flex({ - direction: FlexDirection.Column, - justifyContent: FlexAlign.Start, - alignItems: ItemAlign.Stretch, - }) { - NavBar({ title: $r('app.string.comprehensive_use_case') }); - CaseDescriptor({ - desc: $r('app.string.comprehensive_use_case_desc') - }); - LogContainer({ logString: this.logString }); - Blank().layoutWeight(1); - - Flex({ - direction: FlexDirection.Column, - alignItems: ItemAlign.Stretch, - space: { main: LengthMetrics.vp(8) } - }) { - Button('请求服务端数据').onClick(async () => { - this.requestData() - }).height($r('app.float.vp_40')); - }.width('100%') - .margin({ left: $r('app.float.vp_16') }) - .padding({ right: $r('app.float.vp_16'), top: $r('app.float.vp_16') }); - - }.attributeModifier(this.baseContainerStyles); - } -} \ No newline at end of file diff --git a/entry/src/main/ets/features/networkDataCase/NetworkDataInteractionPage.ets b/entry/src/main/ets/features/networkDataCase/NetworkDataInteractionPage.ets deleted file mode 100644 index 31604d3..0000000 --- a/entry/src/main/ets/features/networkDataCase/NetworkDataInteractionPage.ets +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2025 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { HMRouter } from '@hadss/hmrouter'; -import { TJSON } from '@hadss/turbo-trans-json'; -import { LengthMetrics } from '@kit.ArkUI'; -import { BaseContainerStyles, CaseDescriptor, LogContainer, NavBar } from '../../common'; -import { TcpServerUtil } from '../../utils/NetworkUtil'; -import { Person } from '../../model/sendableCase/Person'; -import { PageRouteConstants } from '../../common/constants/PageRouteConstants'; -import { rcp } from '@kit.RemoteCommunicationKit'; -import Logger from '../../utils/Logger'; -import { BusinessError } from '@ohos.base'; - -@HMRouter({ pageUrl: PageRouteConstants.NETWORK_DATA_INTERACTION_PAGE }) -@Component -export default struct NetworkDataInteractionPage { - private baseContainerStyles: BaseContainerStyles = new BaseContainerStyles(); - @State logString: string = ''; - - aboutToAppear(): void { - TcpServerUtil.create(); - } - - aboutToDisappear(): void { - TcpServerUtil.close(); - } - - requestData() { - const session = rcp.createSession(); - const request = new rcp.Request('http://127.0.0.1:8080'); - session.fetch(request).then((response: rcp.Response) => { - if (response) { - const person = TJSON.fromBuffer(response.body, Person); - this.logString = - `tcpServer响应体:\n person.name: ${person.name}\n person.age: ${person.age}\n person.sex: ${person.sex}\n person.scores: ${person.scores}`; - } - }).catch((err: BusinessError) => { - Logger.error(`requestData error code: ${err.code}, message: ${err.message}`) - }) - } - - build() { - Flex({ - direction: FlexDirection.Column, - justifyContent: FlexAlign.Start, - alignItems: ItemAlign.Stretch, - }) { - NavBar({ title: $r('app.string.network_data_interaction_case') }); - CaseDescriptor({ - desc: $r('app.string.network_data_interaction_case_desc') - }); - LogContainer({ logString: this.logString }); - Blank().layoutWeight(1); - - Flex({ - direction: FlexDirection.Column, - alignItems: ItemAlign.Stretch, - space: { main: LengthMetrics.vp(8) } - }) { - Button('请求服务端数据').onClick(async () => { - this.requestData() - }).height($r('app.float.vp_40')); - }.width('100%') - .margin({ left: $r('app.float.vp_16') }) - .padding({ right: $r('app.float.vp_16'), top: $r('app.float.vp_16') }); - - }.attributeModifier(this.baseContainerStyles); - } -} \ No newline at end of file diff --git a/entry/src/main/ets/model/sendableCase/Person.ets b/entry/src/main/ets/model/Person.ets similarity index 90% rename from entry/src/main/ets/model/sendableCase/Person.ets rename to entry/src/main/ets/model/Person.ets index 73bbd34..15ffa36 100644 --- a/entry/src/main/ets/model/sendableCase/Person.ets +++ b/entry/src/main/ets/model/Person.ets @@ -12,9 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Serializable } from '@hadss/turbo-trans-core'; -@Serializable({ generateSendable: true }) +import { Serializable } from "@hadss/turbo-trans-core"; + +@Serializable() export class Person { public name: string; public age: number; @@ -27,4 +28,4 @@ export class Person { this.sex = sex; this.scores = scores; } -} +} \ No newline at end of file diff --git a/entry/src/main/ets/model/PersonWithObservedV2.ets b/entry/src/main/ets/model/PersonWithObservedV2.ets new file mode 100644 index 0000000..8323cd4 --- /dev/null +++ b/entry/src/main/ets/model/PersonWithObservedV2.ets @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Serializable } from '@hadss/turbo-trans-core'; + +@Serializable({ generateSendable: true }) +@ObservedV2 +export class PersonWithObservedV2 { + @Trace name: string; + @Trace age: number; + @Trace sex: string; + @Trace scores: Array; + + constructor(name: string, age: number, sex: string, scores: Array) { + this.name = name; + this.age = age; + this.sex = sex; + this.scores = scores; + } +} \ No newline at end of file diff --git a/entry/src/main/ets/model/PersonWithSendable.ets b/entry/src/main/ets/model/PersonWithSendable.ets new file mode 100644 index 0000000..bcd9b44 --- /dev/null +++ b/entry/src/main/ets/model/PersonWithSendable.ets @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Serializable } from "@hadss/turbo-trans-core"; + +@Serializable({ generateSendable: true }) +export class PersonWithSendable { + public name: string; + public age: number; + public sex: string; + public scores: Array; + + constructor(name: string, age: number, sex: string, scores: Array) { + this.name = name; + this.age = age; + this.sex = sex; + this.scores = scores; + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets new file mode 100644 index 0000000..d95403c --- /dev/null +++ b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { util } from '@kit.ArkTS'; +import { systemDateTime } from '@kit.BasicServicesKit'; +import { HMRouter } from '@hadss/hmrouter'; +import { JsonNode, JsonNodeType, TJSON } from '@hadss/turbo-trans-json'; +import { + ButtonStyles, CardContainer, CardType, LayoutContainer, PageConstants +} from '../common'; +import { PageRouteConstants } from '../common/constants/PageRouteConstants'; + +@HMRouter({ pageUrl: PageRouteConstants.BIG_JSONFILE_DECODE_PAGE }) +@Component +export default struct BigJsonFileDecodePage { + promptAction = this.getUIContext().getPromptAction(); + context = this.getUIContext().getHostContext(); + private jsonFiles: string[] = [ + 'citylots.json'// JSON file download address https://github.com/zemirco/sf-city-lots-json + ]; + private currentJsonFile: string = ''; + private json: Uint8Array | null = null; + @State duration: number = 0; // File parsing duration + @State fileSize: number = 0; // File size + @State isParsing: boolean = false; // Whether parsing is in progress + @State result: ResourceStr = $r('app.string.wait_select_file'); + @State success: boolean = false; // Parsing result + @State previewText: ResourceStr = $r('app.string.wait_load_file'); // File text preview + @State logContent: ResourceStr = $r('app.string.show_load_content'); // Partial parsing result + + // Add method to extract preview text + private extractPreviewText() { + if (!this.json || this.json.byteLength === 0) { + this.previewText = $r('app.string.file_is_empty'); + return; + } + try { + const decoder = util.TextDecoder.create('utf-8'); + if (this.json.length <= 150) { + this.previewText = decoder.decodeToString(this.json); + } else { + this.previewText = decoder.decodeToString(this.json.slice(0, 150)) + '...'; + } + } catch (error) { + this.previewText = $r('app.string.file_preview_fail'); + } + } + + // Switch JSON file + private changeJsonType(index: number) { + const jsonFile = this.jsonFiles[index]; + this.currentJsonFile = jsonFile; + this.success = false; + this.duration = 0; + this.previewText = $r('app.string.file_preview_loading'); + try { + const context = this.getUIContext().getHostContext(); + if (!context) { + return + } + this.json = context.resourceManager.getRawFileContentSync(this.currentJsonFile); + this.fileSize = this.json.byteLength / 1024 / 1024; + this.result = $r('app.string.file_load_success_wait_analyze', this.fileSize.toFixed(2)); + this.extractPreviewText(); + this.promptAction.showToast({ + message: $r('app.string.file_load_toast', jsonFile) + }); + } catch (e) { + this.previewText = $r('app.string.file_load_fail'); + this.promptAction.showToast({ + message: this.previewText + }); + } + } + + /** + * Start parsing JSON file + */ + private async handleStartAnalyzeFile() { + if (this.isParsing || this.json === null) { + this.promptAction.showToast({ + message: $r('app.string.please_select_file') + }); + return; + } + + this.isParsing = true; + this.result = $r('app.string.file_analyze_ing'); + + try { + // Record start time + const startTime = systemDateTime.getTime(true); + + // Perform parsing + let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); + this.json = null; + + // Test conversion to business object duration + // In practice, you may only need to use JsonNode lazy loading for child nodes + const obj:ESObject = await jsonNode.toPlainObjectAsync(); + + // Calculate duration + const endTime = systemDateTime.getTime(true); + this.duration = (endTime - startTime) / 1e6; + + // Generate log content + this.logContent = this.generateLogContent(jsonNode); + + // Update result + this.success = true; + const keys = jsonNode.jsonObject().keys(); + this.result = $r('app.string.file_analyze_success', Array.from(keys).length, this.duration.toFixed(2)); + + this.promptAction.showToast({ + message: $r('app.string.file_analyze_success_toast') + }); + } catch (e) { + this.success = false; + this.result = $r('app.string.file_analyze_fail', e.message); + this.logContent = $r('app.string.file_analyze_fail', e.message); + this.promptAction.showToast({ + message: $r('app.string.file_analyze_fail_toast') + }); + } finally { + this.isParsing = false; + } + } + + getString(res: Resource, ...args: Array): string { + try { + if (!this.context) { + return '' + } + return this.context.resourceManager.getStringSync(res.id, ...args) + } catch (error) { + return '' + } + } + + // Method to generate log content + private generateLogContent(jsonNode: JsonNode, value: string = '', depth: number = 0): string { + if (depth > 1) { + return '' + } + const jsonType = jsonNode.jsonType(); + if (jsonType === JsonNodeType.JSON_NULL) { + return this.getString($r('app.string.analyze_is_null')); + } + let log = this.getString($r('app.string.analyze_layers'), depth); + if (jsonType === JsonNodeType.JSON_ARRAY) { + log += this.getString($r('app.string.analyze_is_array'), jsonNode.jsonArray().getCapacity()) + log += this.generateLogContent(jsonNode.jsonArray().get(0), '[0]', depth + 1); + return log; + } else if (jsonType === JsonNodeType.JSON_OBJECT) { + const keys = Array.from(jsonNode.jsonObject().keys()); + log += this.getString($r('app.string.analyze_is_object'), keys.length) + log += this.getString($r('app.string.analyze_before_three')) + const count = Math.min(3, keys.length); + for (let i = 0; i < count; i++) { + const key = keys[i]; + let value = jsonNode.jsonObject().get(key); + log += `{${key}: `; + + if (value.jsonType() === JsonNodeType.JSON_ARRAY) { + log += `Array[${value.jsonArray().getCapacity()}]}\n`; + } else if (value.jsonType() === JsonNodeType.JSON_OBJECT) { + log += `Object{${Object.keys(value).length}}}\n`; + } else if (value.jsonType() === JsonNodeType.JSON_PRIMITIVE) { + log += `"${value}"}\n`; + } else { + log += `${value}}\n`; + } + } + + for (let index = 0; index < keys.length; index++) { + const firstKey = keys[index]; + let firstValue: ESObject = jsonNode.jsonObject().get(firstKey); + log += this.generateLogContent(firstValue, value + '.' + firstKey, depth + 1); + } + return log; + } + return log + this.getString($r('app.string.analyze_is_primitive'), jsonNode.jsonPrimitive().toString()); + } + + build() { + LayoutContainer({ + title: $r('app.string.big_json_decode_title') + }) { + CardContainer({ content: $r('app.string.big_jsonfile_decode_desc') }) + Text() { + ForEach(this.jsonFiles, (jsonFile: string, index: number) => { + Span(jsonFile) + .fontColor($r('app.color.text_blue')) + .onClick(() => this.changeJsonType(index)) + if (index !== this.jsonFiles.length - 1) { + Span(' | ') + .fontColor($r('app.color.text_secondary')); + } + }) + } + .width(PageConstants.FULL_WIDTH) + .wordBreak(WordBreak.BREAK_ALL) + .textAlign(TextAlign.JUSTIFY) + .fontSize($r('app.float.font_sm')) + .fontColor($r('app.color.text_secondary')) + + CardContainer({ content: this.previewText, hideTitle: true, cardType: CardType.isLog }) + + CardContainer({ + hideTitle: true + }) { + Span($r('app.string.file_size', this.fileSize.toFixed(2))) + Span($r('app.string.file_analyze_status')) + Span(this.isParsing ? $r('app.string.file_analyze_ing') : + this.success ? $r('app.string.file_analyze_status_success') : $r('app.string.file_analyze_status_pre')) + Span('\n') + Span($r('app.string.file_analyze_time', this.duration.toFixed(2))) + Span($r('app.string.file_analyze_speed', + this.duration > 0 ? (this.fileSize * 1000 / this.duration).toFixed(2) : '--')) + Span(this.result) + } + + CardContainer({ content: this.logContent, cardType: CardType.isLog }) + + Button($r('app.string.file_analyze')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + this.handleStartAnalyzeFile() + }) + } + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/LazyLoadJsonNodePage.ets b/entry/src/main/ets/pages/LazyLoadJsonNodePage.ets new file mode 100644 index 0000000..e430b99 --- /dev/null +++ b/entry/src/main/ets/pages/LazyLoadJsonNodePage.ets @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { HMRouter } from '@hadss/hmrouter'; +import { JsonNode, JsonNodeType, TJSON } from '@hadss/turbo-trans-json'; +import { + ButtonStyles, CardContainer, CardType, LayoutContainer, PageConstants, +} from '../common'; +import { PageRouteConstants } from '../common/constants/PageRouteConstants'; +import { JsonNodeMethod } from '../utils/JsonNodeMethod'; +import { JsonMethod, JsonNodeViewModel, JsonTypeOption } from '../viewmodel/JsonNodeViewModel'; + +@HMRouter({ pageUrl: PageRouteConstants.LAZY_LOAD_JSON_NODE_PAGE }) +@Component +export default struct LazyLoadJsonNodePage { + private viewModel: JsonNodeViewModel = new JsonNodeViewModel(); + @State currentOption: JsonTypeOption | null = null; + @State jsonNode: JsonNode | null = null; + @State jsonNodeTypeSupportMethods: JsonMethod[] = [] + @State selectedMethod: JsonMethod | null = null; + @State methodParam: string = ''; + @State executionResult: ResourceStr = ''; + @State paramPlaceholder: ResourceStr = $r('app.string.please_input_params_placeholder'); + + aboutToAppear(): void { + this.changeJsonType(this.viewModel.jsonTypeOptions[0]) + } + + // 切换JSON类型 + private changeJsonType(option: JsonTypeOption) { + this.currentOption = option; + this.jsonNodeTypeSupportMethods = this.viewModel.getSupportMethodsByJsonNodeType(option.type); + this.jsonNode = TJSON.toJsonNodeFromString(option.content); + this.handleSelectMethods(0) + // 重置执行结果 + this.executionResult = $r('app.string.exec_result_placeholder'); + } + + // 切换jsonNode方法 + private handleSelectMethods(index: number) { + this.selectedMethod = this.jsonNodeTypeSupportMethods[index] ?? null; + if (this.selectedMethod.paramPlaceholder) { + this.paramPlaceholder = this.selectedMethod.paramPlaceholder + } else if (this.jsonNode?.jsonType() === JsonNodeType.JSON_OBJECT) { + this.paramPlaceholder = + this.selectedMethod.paramObjectPlaceholder ?? $r('app.string.please_input_params_placeholder') + } else if (this.jsonNode?.jsonType() === JsonNodeType.JSON_ARRAY) { + this.paramPlaceholder = + this.selectedMethod.paramArrayPlaceholder ?? $r('app.string.please_input_params_placeholder') + } else { + this.paramPlaceholder = $r('app.string.please_input_params_placeholder') + } + } + + build() { + LayoutContainer({ + title: $r('app.string.lazy_load_title') + }) { + CardContainer({ content: $r('app.string.lazy_load_json_node_desc') }) + Text() { + ForEach(this.viewModel.jsonTypeOptions, (option: JsonTypeOption, index: number) => { + Span(option.label) + .fontColor($r('app.color.text_blue')) + .onClick(() => this.changeJsonType(option)); + if (index !== this.viewModel.jsonTypeOptions.length - 1) { + Span(' | ') + .fontColor($r('app.color.text_secondary')); + } + }) + } + .width(PageConstants.FULL_WIDTH) + .wordBreak(WordBreak.BREAK_ALL) + .textAlign(TextAlign.JUSTIFY) + .fontSize($r('app.float.font_sm')) + .fontColor($r('app.color.text_secondary')) + + CardContainer({ content: this.currentOption?.content, hideTitle: true, cardType: CardType.isLog }) + + CardContainer({ content: this.executionResult, cardType: CardType.isLog }) + + Row() { + Text($r('app.string.select_method_label')) + .fontSize(16) + .fontWeight(FontWeight.Medium) + .textAlign(TextAlign.Start) + .margin({ right: 12 }) + Select(this.jsonNodeTypeSupportMethods.map(m => { + return { value: m.label } as SelectOption; + })) + .value(this.selectedMethod?.label) + .onSelect((index: number) => { + this.handleSelectMethods(index); + }) + .layoutWeight(1); + } + .width(PageConstants.FULL_WIDTH) + + if (this.selectedMethod?.requiresParam) { + TextInput({ + placeholder: this.paramPlaceholder + }) + .placeholderColor(0x999999) + .width(PageConstants.FULL_WIDTH) + .height($r('app.float.vp_40')) + .onChange((value) => { + this.methodParam = value; + }); + } + + Button($r('app.string.exec_method_btn')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + if (!this.jsonNode || !this.selectedMethod) { + return + } + this.executionResult = + JsonNodeMethod.getInstance().exec(this.jsonNode, this.selectedMethod?.name, this.methodParam) + }) + } + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/MainPage.ets b/entry/src/main/ets/pages/MainPage.ets index 3768f89..aa29102 100644 --- a/entry/src/main/ets/pages/MainPage.ets +++ b/entry/src/main/ets/pages/MainPage.ets @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025 Huawei Device Co., Ltd. + * Copyright (c) 2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,65 +16,35 @@ import { HMRouter, HMRouterMgr } from '@hadss/hmrouter'; import { BaseContainerStyles, Cell, CellGroup, MainPageListItem } from '../common'; import { PageRouteConstants } from '../common/constants/PageRouteConstants'; -import { TabsMenuConstants } from '../common/constants/TabsMenuConstants'; +import { MenuConstants } from '../common/constants/MenuConstants'; @HMRouter({ pageUrl: PageRouteConstants.MAIN_PAGE }) @Component export default struct MainPage { - private baseContainerStyles: BaseContainerStyles = new BaseContainerStyles(); - private scroller: Scroller = new Scroller(); - private highLevelUsePageList: MainPageListItem[] = TabsMenuConstants.HIGH_LEVEL_USE_PAGE_LIST; + private highLevelUsePageList: MainPageListItem[] = MenuConstants.HIGH_LEVEL_USE_PAGE_LIST; build() { Column() { - Stack({ alignContent: Alignment.Top }) { - Column() { - Scroll(this.scroller) { - Column() { - CellGroup({ title: $r('app.string.high_level_use_scene') }) { - ForEach(this.highLevelUsePageList, (item: MainPageListItem, index: number) => { - Cell({ - title: item.title, - description: item.description, - isLink: true, - isLast: this.highLevelUsePageList.length - 1 === index, - click: () => { - HMRouterMgr.pushAsync(item.pathInfo, item.callback); - } - }) - }, (_item: MainPageListItem, index: number) => index.toString()); - } - } - .backgroundColor($r('app.color.main_content_background')); - } - .scrollBar(BarState.Off) - .padding({ top: 78, bottom: 56 }) - .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]); - }; - - Column() { - Text($r('app.string.main_title')) - .fontSize(24) - .fontWeight(FontWeight.Bold) - .align(Alignment.Bottom) - .padding({ left: 20, right: 20, bottom: 12 }) - .height($r('app.string.title_height')) - .width('100%') - .backdropBlur(20); - } - .height($r('app.string.title_height')) + Text($r('app.string.main_title')) + .height(78) + .fontSize(24) + .fontWeight(FontWeight.Bold) + .padding({ left: 16, right: 16, top: 24 }) .width('100%') - .backgroundColor($r('app.color.main_content_background')) - .opacity(0.9) - .alignItems(HorizontalAlign.Start); + CellGroup({ title: $r('app.string.main_sub_title') }) { + ForEach(this.highLevelUsePageList, (item: MainPageListItem, index: number) => { + Cell({ + title: item.title, + description: item.description, + isLink: true, + isLast: this.highLevelUsePageList.length - 1 === index, + click: () => { + HMRouterMgr.pushAsync(item.pathInfo, item.callback); + } + }) + }, (_item: MainPageListItem, index: number) => index.toString()); } - .height('100%'); - } - .width('100%') - .height('100%') - .attributeModifier(this.baseContainerStyles) - .backgroundColor($r('app.color.main_content_background')) - .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM]); + }.attributeModifier(new BaseContainerStyles()) } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets b/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets new file mode 100644 index 0000000..19d4534 --- /dev/null +++ b/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { lang, taskpool } from '@kit.ArkTS'; +import { rcp } from '@kit.RemoteCommunicationKit'; +import { HMRouter } from '@hadss/hmrouter'; +import { ITSerializable, TJSON } from '@hadss/turbo-trans-json'; +import { ButtonStyles, CardContainer, CardType, LayoutContainer, PageConstants } from '../common'; +import { PageRouteConstants } from '../common/constants/PageRouteConstants'; +import { PersonWithObservedV2 } from '../model/PersonWithObservedV2'; +import TcpServerUtil from '../utils/TcpServerUtil'; + +@Concurrent +async function requestData(): Promise { + const session = rcp.createSession(); + const request = new rcp.Request('http://127.0.0.1:8080?name=john'); + const response: rcp.Response = await session.fetch(request) + if (response) { + const person = TJSON.fromBuffer(response.body, PersonWithObservedV2); + return (person as object as ITSerializable).toSendable(); + } + return undefined +} + +@HMRouter({ pageUrl: PageRouteConstants.NETWORK_AND_SENDABLE_PAGE }) +@ComponentV2 +export default struct NetworkAndObservedV2Page { + promptAction = this.getUIContext().getPromptAction(); + @Local serverIsCreated: boolean = TcpServerUtil.isCreate; + @Local person: PersonWithObservedV2 | null = null; + @Local selectKey: string = ''; + @Local inputValue: string = ''; + + async requestData() { + if (!this.serverIsCreated) { + this.promptAction.showToast({ + message: $r('app.string.please_open_server') + }) + return + } + const task: taskpool.Task = new taskpool.Task(requestData); + const data = await taskpool.execute(task); + this.person = TJSON.toOrigin(data); + + // Select the default selected property key + this.selectKey = Object.keys(this.person)[0]?.replace('__ob_', ''); + } + + /** + * Modify Person property value + * @param name + * @param value + */ + changePersonValue(name: string, value: string) { + if (!this.person) { + return + } + switch (name) { + case 'name': + this.person.name = value + break; + case 'age': + this.person.age = parseInt(value) + break; + case 'sex': + this.person.sex = value; + break; + case 'scores': + this.person.scores = value.split(',').map(item => parseInt(item)); + break; + + default: + break; + } + } + + build() { + LayoutContainer({ + title: $r('app.string.network_and_sendable_title') + }) { + CardContainer({ + content: $r('app.string.network_and_sendable_desc') + }); + CardContainer({ + cardType: CardType.isLog, + title: $r('app.string.server_return_data'), + content: this.person ? + `person.name: ${this.person?.name}\n` + + `person.age: ${this.person?.age}\n` + + `person.sex: ${this.person?.sex}\n` + + `person.scores: ${this.person?.scores}` : + $r('app.string.log_display_placeholder') + }); + Text() { + Span($r('app.string.server_ip')) + Span(`${TcpServerUtil.address}\n`) + Span($r('app.string.server_port')) + Span(`${TcpServerUtil.port}\n`) + Span($r('app.string.server_status')) + Span(this.serverIsCreated ? $r('app.string.open') : $r('app.string.close')) + } + .padding({ + left: $r('app.float.vp_12'), + bottom: $r('app.float.vp_16') + }) + .width(PageConstants.FULL_WIDTH) + .textAlign(TextAlign.Start) + .lineHeight($r('app.float.desc_line_height')) + .fontSize($r('app.float.font_md')) + .fontColor($r('app.color.text_secondary')) + + Button($r('app.string.open_server')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + TcpServerUtil.create().then(() => { + this.serverIsCreated = true; + this.promptAction.showToast({ + message: $r('app.string.open_server_success') + }) + }).catch(() => { + this.promptAction.showToast({ + message: $r('app.string.open_server_fail') + }) + }) + }) + Button($r('app.string.request_start')) + .attributeModifier(new ButtonStyles()) + .onClick(async () => { + this.requestData() + }) + if (this.person) { + Row() { + Text($r('app.string.modify_person_label')) + .fontSize(16) + .fontWeight(FontWeight.Medium) + .textAlign(TextAlign.Start) + .margin({ right: 12 }) + Select(Object.keys(this.person).map(m => { + return { value: m.replace('__ob_', '') } as SelectOption; + })) + .value(this.selectKey) + .onSelect((index: number, value: string) => { + this.selectKey = value; + }) + TextInput({ + placeholder: $r('app.string.request_params_placeholder'), + text: (this.person as object)[this.selectKey].toString() + }) + .placeholderColor(0x999999) + .layoutWeight(1) + .width(PageConstants.FULL_WIDTH) + .height($r('app.float.vp_40')) + .onChange((value) => { + this.changePersonValue(this.selectKey, value); + }) + } + .width(PageConstants.FULL_WIDTH) + } + Button($r('app.string.close_server')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + TcpServerUtil.close().then(() => { + this.serverIsCreated = false; + this.promptAction.showToast({ + message: $r('app.string.closed') + }) + }).catch(() => { + this.promptAction.showToast({ + message: $r('app.string.close_fail') + }) + }) + }) + } + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/NetworkRequestPage.ets b/entry/src/main/ets/pages/NetworkRequestPage.ets new file mode 100644 index 0000000..e99959d --- /dev/null +++ b/entry/src/main/ets/pages/NetworkRequestPage.ets @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { rcp } from '@kit.RemoteCommunicationKit'; +import { HMRouter } from '@hadss/hmrouter'; +import { TJSON } from '@hadss/turbo-trans-json'; +import { + ButtonStyles, CardContainer, CardType, LayoutContainer, PageConstants, +} from '../common'; +import TcpServerUtil, { users } from '../utils/TcpServerUtil'; +import { Person } from '../model/Person'; +import { PageRouteConstants } from '../common/constants/PageRouteConstants'; + +@HMRouter({ pageUrl: PageRouteConstants.NETWORK_REQUEST_PAGE }) +@Component +export default struct NetworkRequestPage { + promptAction = this.getUIContext().getPromptAction(); + @State serverIsCreated: boolean = TcpServerUtil.isCreate; + @State requestParams: string = ''; + @State person: Person | null = null; + + async requestData() { + if (!this.serverIsCreated) { + this.promptAction.showToast({ + message: $r('app.string.please_open_server') + }) + return + } + const session = rcp.createSession(); + const request = new rcp.Request(`http://${TcpServerUtil.address}:${TcpServerUtil.port}?name=${this.requestParams}`); + const response = await session.fetch(request); + if (response && response.body) { + this.person = TJSON.fromBuffer(response.body, Person); + } else { + this.person = null; + this.promptAction.showToast({ + message: $r('app.string.server_return_empty') + }) + } + } + + build() { + LayoutContainer({ + title: $r('app.string.network_request_title') + }) { + CardContainer({ + content: $r('app.string.network_request_desc') + }) + CardContainer({ + cardType: CardType.isLog, + title: $r('app.string.server_data'), + content: TJSON.toString(users, { classKey: 'Array', genericTypes: [Person] }) + }) + + Text() { + Span($r('app.string.server_ip')) + Span(`${TcpServerUtil.address}\n`) + Span($r('app.string.server_port')) + Span(`${TcpServerUtil.port}\n`) + Span($r('app.string.server_status')) + Span(this.serverIsCreated ? $r('app.string.open') : $r('app.string.close')) + } + .padding({ + left: $r('app.float.vp_12'), + bottom: $r('app.float.vp_16') + }) + .width(PageConstants.FULL_WIDTH) + .textAlign(TextAlign.Start) + .lineHeight($r('app.float.desc_line_height')) + .fontSize($r('app.float.font_md')) + .fontColor($r('app.color.text_secondary')) + + CardContainer({ + cardType: CardType.isLog, + title: $r('app.string.server_return_data'), + content: this.person ? + `person.name: ${this.person?.name}\n` + + `person.age: ${this.person?.age}\n` + + `person.sex: ${this.person?.sex}\n` + + `person.scores: ${this.person?.scores}` : + $r('app.string.log_display_placeholder') + }) + + Button($r('app.string.open_server')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + TcpServerUtil.create().then(() => { + this.serverIsCreated = true; + this.promptAction.showToast({ + message: $r('app.string.open_server_success') + }) + }).catch(() => { + this.promptAction.showToast({ + message: $r('app.string.open_server_fail') + }) + }) + }) + Row() { + Text($r('app.string.request_params_title')) + .fontSize(16) + .fontWeight(FontWeight.Medium) + .textAlign(TextAlign.Start) + .margin({ right: 12 }) + TextInput({ + placeholder: $r('app.string.request_params_placeholder'), + text: this.requestParams + }) + .placeholderColor(0x999999) + .layoutWeight(1) + .width(PageConstants.FULL_WIDTH) + .height($r('app.float.vp_40')) + .onChange((value) => { + this.requestParams = value; + }) + } + + Button($r('app.string.request_start')) + .attributeModifier(new ButtonStyles()) + .onClick(async () => { + this.requestData() + }) + Button($r('app.string.close_server')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + TcpServerUtil.close().then(() => { + this.serverIsCreated = false; + this.promptAction.showToast({ + message: $r('app.string.closed') + }) + }).catch(() => { + this.promptAction.showToast({ + message: $r('app.string.close_fail') + }) + }) + }) + } + } +} \ No newline at end of file diff --git a/entry/src/main/ets/features/sendableCase/WithSendablePage.ets b/entry/src/main/ets/pages/WithSendablePage.ets similarity index 38% rename from entry/src/main/ets/features/sendableCase/WithSendablePage.ets rename to entry/src/main/ets/pages/WithSendablePage.ets index 485ceb0..a9573a8 100644 --- a/entry/src/main/ets/features/sendableCase/WithSendablePage.ets +++ b/entry/src/main/ets/pages/WithSendablePage.ets @@ -13,70 +13,63 @@ * limitations under the License. */ +import { taskpool } from '@kit.ArkTS'; import { HMRouter } from '@hadss/hmrouter'; import { ITSerializable, TJSON } from '@hadss/turbo-trans-json'; -import { BaseContainerStyles, CaseDescriptor, LogContainer, NavBar } from '../../common'; -import { taskpool } from '@kit.ArkTS'; -import { PageRouteConstants } from '../../common/constants/PageRouteConstants'; -import { Person } from '../../model/sendableCase/Person'; +import { ButtonStyles, CardContainer, CardType, CodeExample, LayoutContainer } from '../common'; +import { PageRouteConstants } from '../common/constants/PageRouteConstants'; +import { PersonWithSendable } from '../model/PersonWithSendable'; @Concurrent function childThreadTask() { - const person: Person = new Person('John', 20, 'man', [1, 2, 3]); + const person = new PersonWithSendable('John', 20, 'man', [1, 2, 3]); return (person as object as ITSerializable).toSendable() } @HMRouter({ pageUrl: PageRouteConstants.WITH_SENDABLE_PAGE }) -@ComponentV2 +@Component export default struct WithSendablePage { - private baseContainerStyles: BaseContainerStyles = new BaseContainerStyles(); - private title: ResourceStr = $r('app.string.with_sendable_serialization'); - @Local logString: string = ''; - - aboutToAppear(): void { - this.buildLogString(); - } + @State person: PersonWithSendable | null = null; + @State personStr: string = ''; async buildLogString() { const task: taskpool.Task = new taskpool.Task(childThreadTask); const data = await taskpool.execute(task); - const person: Person = TJSON.toOrigin(data); - const personStr = TJSON.toString(person, Person); - this.logString = `多线程获取的数据\n序列化: \n` + `sendableStr: ${personStr}\n` + - `反序列化: \n person.name: ${person.name}\n person.age: ${person.age}\n person.sex: ${person.sex}\n person.scores: ${person.scores}`; + this.person = TJSON.toOrigin(data); + this.personStr = TJSON.toString(this.person, PersonWithSendable); } build() { - Flex({ - direction: FlexDirection.Column, - justifyContent: FlexAlign.Start, - alignItems: ItemAlign.Stretch, + + LayoutContainer({ + title: $r('app.string.with_sendable_title') }) { - NavBar({ title: this.title }); - Scroll() { - Column() { - CaseDescriptor({ - desc: $r('app.string.with_sendable_serialization_desc') - }); - CaseDescriptor({ - title: '定义序列化类', - desc: `@Serializable({ generateSendable: true }) -export class Person { - public name: string; - public age: number; - public sex: string; - public scores: Array; - constructor(name: string, age: number, sex: string, scores: Array) { - this.name = name; - this.age = age; - this.sex = sex; - this.scores = scores; - } -}` - }); - LogContainer({ logString: this.logString }); - } - }.layoutWeight(1) - }.attributeModifier(this.baseContainerStyles); + CardContainer({ + content: $r('app.string.with_sendable_desc') + }); + CardContainer({ + cardType: CardType.isCode, + title: $r('app.string.define_the_serialization_class'), + content: CodeExample.DEFINE_THE_SERIALIZATION_CLASS + }); + CardContainer({ + cardType: CardType.isCode, + title: $r('app.string.cross_thread_usage'), + content: CodeExample.CROSS_THREAD_USAGE + }); + CardContainer({ + cardType: CardType.isLog, + content: this.person ? $r('app.string.serialization', + `person.name: ${this.person?.name}\n` + + `person.age: ${this.person?.age}\n` + + `person.sex: ${this.person?.sex}\n` + + `person.scores: ${this.person?.scores}\n`, `: ${this.personStr}`) : $r('app.string.log_display_placeholder') + }); + Button($r('app.string.execute_the_serialization_method')) + .attributeModifier(new ButtonStyles()) + .onClick(() => { + this.buildLogString() + }) + } } } \ No newline at end of file diff --git a/entry/src/main/ets/utils/JsonNodeMethod.ets b/entry/src/main/ets/utils/JsonNodeMethod.ets new file mode 100644 index 0000000..7c85dcd --- /dev/null +++ b/entry/src/main/ets/utils/JsonNodeMethod.ets @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { JsonNode, JsonNodeType } from "@hadss/turbo-trans-json"; + +export class JsonNodeMethod { + jsonNode!: JsonNode; + private static _instance: JsonNodeMethod = new JsonNodeMethod(); + private methodsMap: Map = new Map(); + + private constructor() { + this.methodsMap.set('at', this.at.bind(this)); + this.methodsMap.set('exists', this.exists.bind(this)); + this.methodsMap.set('jsonPrimitive', this.jsonPrimitive.bind(this)); + this.methodsMap.set('jsonObject', this.jsonObject.bind(this)); + this.methodsMap.set('jsonArray', this.jsonArray.bind(this)); + this.methodsMap.set('jsonNull', this.jsonNull.bind(this)); + this.methodsMap.set('jsonType', this.jsonType.bind(this)); + this.methodsMap.set('toString', this.toString.bind(this)); + this.methodsMap.set('has', this.has.bind(this)); + this.methodsMap.set('getCapacity', this.getCapacity.bind(this)); + this.methodsMap.set('get', this.get.bind(this)); + this.methodsMap.set('keys', this.keys.bind(this)); + this.methodsMap.set('values', this.values.bind(this)); + this.methodsMap.set('keys', this.keys.bind(this)); + this.methodsMap.set('entries', this.entries.bind(this)); + this.methodsMap.set('boolean', this.boolean.bind(this)); + this.methodsMap.set('number', this.number.bind(this)); + this.methodsMap.set('string', this.string.bind(this)); + this.methodsMap.set('bigint', this.bigint.bind(this)); + } + + static getInstance() { + return JsonNodeMethod._instance + } + + private at(methodParam: string): string { + const result = this.jsonNode.at(methodParam); + return this.formatResult(result); + } + + private exists(): string { + const result = this.jsonNode.exists(); + return `${result}` + } + + private jsonPrimitive(): string { + const result = this.jsonNode.jsonPrimitive(); + return this.formatResult(result); + } + + private jsonObject(): string { + const result = this.jsonNode.jsonObject(); + return this.formatResult(result); + } + + private jsonArray(): string { + const result = this.jsonNode.jsonArray(); + return this.formatResult(result); + } + + private jsonNull(): string { + const result = this.jsonNode.jsonNull(); + return this.formatResult(result); + } + + private jsonType(): string { + const result = this.jsonNode.jsonType(); + return `${this.getJsonNodeTypeName(result)}`; + } + + private toString(): string { + const result = this.jsonNode.toString(); + return`${result}`; + } + + private has(methodParam: string): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const obj = this.jsonNode.jsonObject(); + const result = obj.has(methodParam); + return `has("${methodParam}"): ${result}`; + } else { + return 'has方法只能在JsonObject上使用'; + } + } + + private getCapacity() { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { + const obj = this.jsonNode.jsonArray(); + const result = obj.getCapacity(); + return `${result}`; + } else { + return 'getCapacity方法只能在JsonArray上使用'; + } + } + + private get(methodParam: string): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const obj = this.jsonNode.jsonObject(); + const result = obj.get(methodParam); + return this.formatResult(result); + } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { + const arr = this.jsonNode.jsonArray(); + const index = parseInt(methodParam); + if (isNaN(index)) { + return '参数必须是数字索引'; + } else { + const result = arr.get(index); + return this.formatResult(result); + } + } else { + return 'get方法只能在JsonObject或JsonArray上使用'; + } + } + + private keys(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const obj = this.jsonNode.jsonObject(); + const keys = obj.keys(); + return `${Array.from(keys).join('\n')}`; + } else { + return 'keys方法只能在JsonObject上使用'; + } + } + + private values(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const obj = this.jsonNode.jsonObject(); + const values = obj.values(); + return `${Array.from(values).map(v => this.formatResult(v)).join('\n')}`; + } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { + const obj = this.jsonNode.jsonArray(); + const values = obj.values(); + return `${Array.from(values).map(v => this.formatResult(v)).join('\n')}`; + } else { + return 'values方法只能在JsonObject和JsonArray上使用'; + } + } + + private entries(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const obj = this.jsonNode.jsonObject(); + const entries = Array.from(obj.entries()); + return entries.map((entry) => `${entry[0]}: ${this.formatResult(entry[1])}`).join('\n'); + } else if (this.jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { + const obj = this.jsonNode.jsonArray(); + const entries = Array.from(obj.entries()); + return entries.map((entry) => `${entry[0]}: ${this.formatResult(entry[1])}`).join('\n'); + } else { + return 'entries方法只能在JsonObject和JsonArray上使用'; + } + } + + private boolean(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { + const primitive = this.jsonNode.jsonPrimitive(); + const result = primitive.booleanOrThrow(); + return `${result}`; + } else { + return 'boolean方法只能在布尔类型的JsonPrimitive上使用'; + } + } + + private number(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { + const primitive = this.jsonNode.jsonPrimitive(); + const result = primitive.numberOrThrow(); + return `${result}`; + } else { + return 'number方法只能在数字类型的JsonPrimitive上使用'; + } + } + + private string(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { + const primitive = this.jsonNode.jsonPrimitive(); + const result = primitive.stringOrThrow(); + return `${result}`; + } else { + return 'string方法只能在字符串类型的JsonPrimitive上使用'; + } + } + + private bigint(): string { + if (this.jsonNode.jsonType() === JsonNodeType.JSON_PRIMITIVE) { + const primitive = this.jsonNode.jsonPrimitive(); + const result = primitive.bigintOrThrow(); + return `${result}`; + } else { + return 'bigint方法只能在字符串类型的JsonPrimitive上使用'; + } + } + + // 格式化结果显示 + private formatResult(result: JsonNode): string { + if (result === null || result === undefined) { + return 'null'; + } + return result.toString(); + } + + // 获取JsonNode类型名称 + private getJsonNodeTypeName(type: JsonNodeType): string { + switch (type) { + case JsonNodeType.JSON_OBJECT: + return '对象(JsonObject)'; + case JsonNodeType.JSON_ARRAY: + return '数组(JsonArray)'; + case JsonNodeType.JSON_PRIMITIVE: + return '基础类型(JsonPrimitive)'; + case JsonNodeType.JSON_NULL: + return '空值(JsonNull)'; + default: + return '未知类型'; + } + } + + public exec(jsonNode: JsonNode, methodName: string, methodParam?: string): string { + try { + this.jsonNode = jsonNode; + const func = this.methodsMap.get(methodName); + if (!func) { + return '未知方法'; + } + return func(methodParam); + } catch (e) { + return `执行错误: ${e.message}` + } + } +} \ No newline at end of file diff --git a/entry/src/main/ets/utils/NetworkUtil.ets b/entry/src/main/ets/utils/TcpServerUtil.ets similarity index 39% rename from entry/src/main/ets/utils/NetworkUtil.ets rename to entry/src/main/ets/utils/TcpServerUtil.ets index 77ee971..d477d1a 100644 --- a/entry/src/main/ets/utils/NetworkUtil.ets +++ b/entry/src/main/ets/utils/TcpServerUtil.ets @@ -1,6 +1,24 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { socket } from '@kit.NetworkKit'; import { BusinessError } from '@kit.BasicServicesKit'; import Logger from './Logger'; +import { Person } from '../model/Person'; +import { url } from '@kit.ArkTS'; +import { TJSON } from '@hadss/turbo-trans-json'; export class SocketInfo { public message: ArrayBuffer = new ArrayBuffer(1); @@ -8,28 +26,32 @@ export class SocketInfo { } /** - * 创建服务端 + * Create server */ -export class TcpServerUtil { - // 创建一个TCPSocketServer连接,返回一个TCPSocketServer对象。 - public static tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance(); +class TcpServerUtil { + // Create a TCPSocketServer connection, return a TCPSocketServer object. + public tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance(); + public isCreate: boolean = false; + public address = '127.0.0.1'; + public port = 8080; - public static create() { - // 绑定本地IP地址和端口,进行监听。 - let ipAddress: socket.NetAddress = {} as socket.NetAddress; - ipAddress.address = '127.0.0.1'; - ipAddress.port = 8080; - TcpServerUtil.tcpServer.listen(ipAddress).then(() => { + public create(): Promise { + return this.tcpServer.listen({ + address: this.address, + port: this.port + }).then(() => { Logger.info('tcpServer listen success'); - TcpServerUtil.connect(); + this.isCreate = true; + this.connect(); }).catch((err: BusinessError) => { Logger.error('tcpServer listen fail'); }); + } - // 订阅TCPSocketServer的connect事件,客户端与服务端建立连接后,返回一个TCPSocketConnection对象,用于与客户端通信。 - public static connect() { - TcpServerUtil.tcpServer.on('connect', (client: socket.TCPSocketConnection) => { + // Subscribe to the connect event of TCPSocketServer, after the client connects to the server, return a TCPSocketConnection object for communication with the client. + public connect() { + this.tcpServer.on('connect', (client: socket.TCPSocketConnection) => { client.on('close', () => { Logger.info('tcpServer on close success'); }); @@ -40,6 +62,13 @@ export class TcpServerUtil { for (let i = 0; i < dataView.byteLength; ++i) { str += String.fromCharCode(dataView.getUint8(i)); } + + // Request line: GET /path?name=John HTTP/1.1 + const requestData = str.split('\r\n')[0]?.split(' '); + const requestPath = requestData[1]?.split('?'); + const objParams = new url.URLParams(requestPath[1]); + const name = objParams.get('name'); + Logger.info('tcpServer received message--:' + str); Logger.info('tcpServer received address--:' + value.remoteInfo.address); Logger.info('tcpServer received family--:' + value.remoteInfo.family); @@ -47,7 +76,7 @@ export class TcpServerUtil { Logger.info('tcpServer received size--:' + value.remoteInfo.size); let tcpSendOptions: socket.TCPSendOptions = {} as socket.TCPSendOptions; - tcpSendOptions.data = buildHttpResponse(); + tcpSendOptions.data = buildHttpResponse(name); client.send(tcpSendOptions).then(() => { Logger.info('tcpServer send success'); }).catch((err: Object) => { @@ -57,15 +86,32 @@ export class TcpServerUtil { }); } - public static close() { - TcpServerUtil.tcpServer.close(); + public close(): Promise { + return this.tcpServer.close().then(() => { + this.isCreate = false; + }) } } -// 构建HTTP响应报文 -export function buildHttpResponse(): string { - // 模拟服务端数据返回 - const body = '{"name":"John","age":20,"sex":"man","scores":[1,2,3]}' +export default new TcpServerUtil(); + +export const users: Person[] = [ + new Person('john', 18, 'man', [10, 20, 30]), + new Person('landon', 19, 'man', [11, 21, 31]), + new Person('bruce', 20, 'man', [12, 22, 32]), + new Person('aron', 21, 'man', [13, 23, 33]), + new Person('sini', 22, 'woman', [14, 24, 34]), + new Person('cloe', 23, 'woman', [15, 25, 35]), +] + +// Build HTTP response message +function buildHttpResponse(name: string | null): string { + // Simulate server data return + const filter = users.find(user => user.name === name); + let body = '' + if (filter) { + body = TJSON.toString(filter) + } return [ 'HTTP/1.1 200 OK', 'Content-Type: text/html; charset=utf-8', diff --git a/entry/src/main/ets/viewmodel/JsonNodeViewModel.ets b/entry/src/main/ets/viewmodel/JsonNodeViewModel.ets new file mode 100644 index 0000000..253b4e1 --- /dev/null +++ b/entry/src/main/ets/viewmodel/JsonNodeViewModel.ets @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { JsonNodeType } from "@hadss/turbo-trans-json"; + +export interface JsonMethod { + name: string; + label: string; + requiresParam: boolean; + paramPlaceholder?: string; + paramObjectPlaceholder?: string; + paramArrayPlaceholder?: string; + supportedTypes: JsonNodeType[]; +} + +// JSON类型选项 +export interface JsonTypeOption { + name: string; + label: string; + value: string; + type: JsonNodeType; + content: string; +} + +export class JsonNodeViewModel { + public jsonTypeOptions: JsonTypeOption[] = [ + { + name: 'object', + label: 'JsonObject', + value: 'object', + type: JsonNodeType.JSON_OBJECT, + content: '{\n' + + '\t\t"name": "kennen",\n' + + '\t\t"age": 25,\n' + + '\t\t"address": {\n' + + '\t\t\t\t"city": "Wuhan"\n' + + '\t\t}\n' + + '}' + }, + { + name: 'array', + label: 'JsonArray', + value: 'array', + type: JsonNodeType.JSON_ARRAY, + content: '[\n' + + '\t\t"apple",\n' + + '\t\t1234,\n' + + '\t\t{"color": "orange"}\n' + + ']' + }, + { + name: 'primitive', + label: 'JsonPrimitive', + value: 'primitive', + type: JsonNodeType.JSON_PRIMITIVE, + content: '"Hello, World!"' + }, + { + name: 'null', + label: 'JsonNull', + value: 'null', + type: JsonNodeType.JSON_NULL, + content: 'null' + } + ]; + + private allMethods: Array = [ + { + name: 'at', + label: 'at #JsonPointer查询#', + requiresParam: true, + paramObjectPlaceholder: '输入JsonPointer (如: /address/city)', + paramArrayPlaceholder: '输入JsonPointer (如: /2/color)', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] + }, + { + name: 'exists', + label: 'exists #检查是否存在值#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, + JsonNodeType.JSON_NULL] + }, + { + name: 'jsonType', + label: 'jsonType #获取类型#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, + JsonNodeType.JSON_NULL] + }, + { + name: 'toString', + label: 'toString #转换为JSON字符串#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY, JsonNodeType.JSON_PRIMITIVE, + JsonNodeType.JSON_NULL] + }, + { + name: 'has', + label: 'has #判断键存在#', + requiresParam: true, + paramPlaceholder: '输入键名', + supportedTypes: [JsonNodeType.JSON_OBJECT] + }, + { + name: 'getCapacity', + label: 'getCapacity #获取数组元素个数#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_ARRAY] + }, + { + name: 'get', + label: 'get #获取键或索引对应的值#', + requiresParam: true, + paramPlaceholder: '输入键名或索引', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] + }, + { + name: 'keys', + label: 'keys #获取所有键#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT] + }, + { + name: 'values', + label: 'values #获取所有值#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] + }, + { + name: 'entries', + label: 'entries #获取所有键-值对#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_OBJECT, JsonNodeType.JSON_ARRAY] + }, + { + name: 'boolean', + label: 'boolean #获取布尔值#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_PRIMITIVE] + }, + { + name: 'number', + label: 'number #获取数值#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_PRIMITIVE] + }, + { + name: 'string', + label: 'string #获取字符串#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_PRIMITIVE] + }, + { + name: 'bigint', + label: 'bigint #获取大数#', + requiresParam: false, + paramPlaceholder: '', + supportedTypes: [JsonNodeType.JSON_PRIMITIVE] + }, + ]; + + getSupportMethodsByJsonNodeType(jsonNodeType: JsonNodeType): JsonMethod[] { + return this.allMethods.filter(method => method.supportedTypes.includes(jsonNodeType)); + } + + getJsonNodeOptionByJsonNodeType(jsonNodeType: JsonNodeType): JsonTypeOption | undefined { + return this.jsonTypeOptions.find(option => option.type === jsonNodeType) + } +} \ No newline at end of file diff --git a/entry/src/main/resources/base/element/float.json b/entry/src/main/resources/base/element/float.json index a3a054f..02b8b4e 100644 --- a/entry/src/main/resources/base/element/float.json +++ b/entry/src/main/resources/base/element/float.json @@ -154,7 +154,7 @@ }, { "name": "log_display_area_max_height", - "value": "300vp" + "value": "230vp" }, { "name": "log_display_area_margin", diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index 06c9f2c..3b7a134 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -12,61 +12,53 @@ "name": "EntryAbility_label", "value": "高性能JSON解析" }, - { - "name": "title_height", - "value": "78" - }, - { - "name": "bottom_height", - "value": "78" - }, { "name": "main_title", "value": "开发者示例场景" }, { - "name": "high_level_use_scene", + "name": "main_sub_title", "value": "TurboTransJSON序列化使用" }, { - "name": "with_sendable_serialization", - "value": "结合Sendable跨线程使用" - }, - { - "name": "with_sendable_serialization_desc", - "value": "给自定义类添加@Serializable({ generateSendable: true })装饰器,可以生成Sendable类和自定义类型相互转换方法,用做跨线程对象传输,不破坏对象结构。" - }, - { - "name": "network_data_interaction_case", + "name": "network_request_title", "value": "网络数据交互场景" }, { - "name": "network_data_interaction_case_desc", + "name": "network_request_desc", "value": "该场景结合Sendable演示跨线程发起网络请求之后,反序列化服务端返回业务数据" }, { - "name": "comprehensive_use_case", - "value": "综合使用场景" + "name": "with_sendable_title", + "value": "结合Sendable跨线程使用" + }, + { + "name": "with_sendable_desc", + "value": "给自定义类添加@Serializable({ generateSendable: true })装饰器,可以生成Sendable类和自定义类型相互转换方法,用做跨线程对象传输,不破坏对象结构。" }, { - "name": "comprehensive_use_case_desc", - "value": "综合使用场景结合Sendable跨线程网络请求数据返回Sendable对象给主线程,主线程接收Sendable对象之后,通过toOrigin方法转换为业务对象" + "name": "network_and_sendable_title", + "value": "结合跨线程和网络数据交互场景" }, { - "name": "custom_serializer", - "value": "自定义序列化器" + "name": "network_and_sendable_desc", + "value": "综合使用场景结合Sendable跨线程网络请求数据返回Sendable对象给主线程,主线程接收Sendable对象之后,通过toOrigin方法转换为业务对象;同时业务对象使用状态变量ObserveV2,可以直接修改对象属性,触发页面刷新。" }, { - "name": "stream_data_decode", + "name": "big_json_decode_title", "value": "JSON大文件解析" }, { - "name": "lazy_load_JsonNode", + "name": "lazy_load_title", "value": "懒加载(JsonNode)" }, { - "name": "case_description", - "value": "案例描述" + "name": "lazy_load_json_node_desc", + "value": "JsonNode提供一种直接处理Json数据流的便捷方式,开发者无需维护庞大数据流中对应的复杂业务对象。懒加载机制使得Json解析时机延迟到真正使用时。通过JsonNode维护Json数据流中关注的部分内容,节省了内存占用。" + }, + { + "name": "big_jsonfile_decode_desc", + "value": "提供解析大Json文件(>50MB)的功能,支持同步和异步操作。" }, { "name": "cancel", @@ -80,37 +72,257 @@ "name": "confirm", "value": "确定" }, + { + "name": "case_description", + "value": "案例描述" + }, { "name": "log_display_area", - "value": "日志展示区" + "value": "执行结果" }, { - "name": "log_display_placeholder", - "value": "暂无相关日志展示" + "name": "code_sample", + "value": "示例代码" }, { - "name": "developer_scenario_case", - "value": "开发者场景案例" + "name": "log_display_placeholder", + "value": "暂无相关结果展示" }, { "name": "loading_state", "value": "加载中..." }, { - "name": "basic_demo", - "value": "基础演示" + "name": "define_the_serialization_class", + "value": "定义序列化类" }, { - "name": "state_demo", - "value": "与状态管理协作" + "name": "cross_thread_usage", + "value": "跨线程使用示例" }, { - "name": "big_jsonfile_decode_desc", - "value": "提供解析大Json文件(>50MB)的功能,支持同步和异步操作。" + "name": "execute_the_serialization_method", + "value": "执行序列化方法" }, { - "name": "lazy_load_jsonnode_desc", - "value": "JsonNode提供一种直接处理Json数据流的便捷方式,开发者无需维护庞大数据流中对应的复杂业务对象。懒加载机制使得Json解析时机延迟到真正使用时。通过JsonNode维护Json数据流中关注的部分内容,节省了内存占用。" + "name": "please_open_server", + "value": "请先开启服务端" + }, + { + "value": "服务端返回数据为空", + "name": "server_return_empty" + }, + { + "value": "服务端数据", + "name": "server_data" + }, + { + "value": "服务端返回数据", + "name": "server_return_data" + }, + { + "value": "服务端IP地址: ", + "name": "server_ip" + }, + { + "value": "服务端端口: ", + "name": "server_port" + }, + { + "value": "服务端状态: ", + "name": "server_status" + }, + { + "value": "开启", + "name": "open" + }, + { + "value": "关闭", + "name": "close" + }, + { + "value": "开启服务端", + "name": "open_server" + }, + { + "value": "开启成功", + "name": "open_server_success" + }, + { + "value": "开启失败", + "name": "open_server_fail" + }, + { + "value": "请求Person.name参数:", + "name": "request_params_title" + }, + { + "value": "输入值", + "name": "request_params_placeholder" + }, + { + "value": "发起请求", + "name": "request_start" + }, + { + "value": "关闭服务端", + "name": "close_server" + }, + { + "value": "已关闭", + "name": "closed" + }, + { + "value": "关闭失败", + "name": "close_fail" + }, + { + "value": "%s序列化%s", + "name": "serialization" + }, + { + "value": "%s反序列化%s", + "name": "deserialization" + }, + { + "value": "修改Person属性:", + "name": "modify_person_label" + }, + { + "value": "等待选择文件...", + "name": "wait_select_file" + }, + { + "value": "请先加载文件...", + "name": "wait_load_file" + }, + { + "value": "显示部分解析结果...", + "name": "show_load_content" + }, + { + "value": "文件内容为空", + "name": "file_is_empty" + }, + { + "value": "预览解析失败", + "name": "file_preview_fail" + }, + { + "value": "加载中...", + "name": "file_preview_loading" + }, + { + "value": "文件加载成功,大小: %s MB,等待解析...", + "name": "file_load_success_wait_analyze" + }, + { + "value": "已加载文件%s", + "name": "file_load_toast" + }, + { + "value": "加载失败,文件路径不存在", + "name": "file_load_fail" + }, + { + "value": "请先点击任意文件加载内容", + "name": "please_select_file" + }, + { + "value": "正在解析JSON文件...", + "name": "file_analyze_ing" + }, + { + "value": "文件解析", + "name": "file_analyze" + }, + { + "value": "JSON文件解析完成", + "name": "file_analyze_success_toast" + }, + { + "value": "共解析%d个顶层属性,耗时%s毫秒", + "name": "file_analyze_success" + }, + { + "value": "JSON文件解析失败", + "name": "file_analyze_fail_toast" + }, + { + "value": "JSON文件解析失败:%s", + "name": "file_analyze_fail" + }, + { + "value": "文件大小: %s MB\n", + "name": "file_size" + }, + { + "value": "解析状态: ", + "name": "file_analyze_status" + }, + { + "value": "未开始", + "name": "file_analyze_status_pre" + }, + { + "value": "解析中...", + "name": "file_analyze_status_ing" + }, + { + "value": "成功", + "name": "file_analyze_status_success" + }, + { + "value": "解析耗时: %s ms\n", + "name": "file_analyze_time" + }, + { + "value": "解析速度: %s MB/s\n", + "name": "file_analyze_speed" + }, + { + "value": "输入参数", + "name": "please_input_params_placeholder" + }, + { + "value": "执行结果将显示在这里", + "name": "exec_result_placeholder" + }, + { + "value": "选择方法:", + "name": "select_method_label" + }, + { + "value": "执行方法", + "name": "exec_method_btn" + }, + { + "value": "解析结果为空", + "name": "analyze_is_null" + }, + { + "value": "当前结构为数组,元素个数为: %d \n", + "name": "analyze_is_array" + }, + { + "value": "当前结构为对象,Key数量为: %d \n", + "name": "analyze_is_object" + }, + { + "value": "解析结果为基本类型: %s \n", + "name": "analyze_is_primitive" + }, + { + "value": "============ 第%d层 ============\n", + "name": "analyze_layers" + }, + { + "value": "展示前三个{Key: Value}:\n", + "name": "analyze_before_three" + }, + { + "value": "更多", + "name": "more" } ] } \ No newline at end of file diff --git a/hvigorfile.ts b/hvigorfile.ts index 9517006..33c4c3b 100644 --- a/hvigorfile.ts +++ b/hvigorfile.ts @@ -8,9 +8,9 @@ export default { plugins: [ appPlugin({ ignoreModuleNames: [] }), turboTransJsonPlugin(hvigor, { - ignoreModuleNames: [/** 不需要扫描的模块名,如: 'SomeLibModule' */], + ignoreModuleNames: [/** Module names that do not need to be scanned, e.g.: 'SomeLibModule' */], scanDir: ['src/main/ets'], - deserializationMode: 'performance', // 反序列化模式,可选值: 'performance' | 'strict' + deserializationMode: 'performance', // Deserialization mode, optional values: 'performance' | 'strict' }), ] /* Custom plugin to extend the functionality of Hvigor. */ } \ No newline at end of file diff --git a/screenshots/device/image.png b/screenshots/device/image.png index 2728a3c37aa89a2efbb95b76e9a372f0a775ee59..b09839222d6c672382c76e534e2d1caaa8fb8bf6 100644 GIT binary patch literal 128104 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�z@`MxdzoSrbgp$9#xi+ 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

i6OuB0hCq|^9CSh6^CM`wLatk zjt1cuRLTp~Ngrc#KAnEgfnz8yzH9EA=NHEKCSU_k<}y$ZdoQC?3JTb@6D7&sL9SUv zW9tB_JA|?>EZ7hey!I&`d;JUYIxQhNk*uzwo$P_!d&1JllKh)lT`Yc9w_bfqP8R&D zLd_A!kjkd5A8&PAS@EfVKP|g>^5^|oOQp0Iwl}7r{)*tTct}>2(p`qyq{v>KAPS&y z1JZoSj)ojuS>LGsp6Z%H4YasBND4dI7}|S7QDPP$Lejx#lBblMPGlU=@Igk(d-qDa zzDOd&h-DS6;`6_Bw0AMpq}cQJqBP?q zboqGW?vJu`ja*A_J6&XW_fg8ZH%mn0l*&O4UM`dy#&vh`b}GxahYBX7fG#PdtE70`t?OS?r?ITFd@!}&XCI-p z=%-Bl7O*4!QRLo`65X0nezkgUbs{V`m6-Q?H;*bsrZ|xmRllD}&CLfzpA+xuEYD~2 zN!Lc|>q_c(Oi6{QUTx^T#UE*zE^CqV;@MP9rJG36%bRvwj!h9-WaxjRcd~V5a=al( zlu)}2LEQWERPAr8PQ^BdmvvaKeNz)pk$g81)G%wu6G^PBB>=~g^>{%@CBCU@la4yZQp|+%C_c%Q! zW^#cm;TOOc2n*WFo+}+`SsKdx7+X*NUJ#`0wQ3}`RRn*;lPg34angfxmd;7EFZ=(7-+b|IJCJu%Fl`D@9C;VcY zzpA8^{pewC>DNh+u@G6gny&m#k@_!{Ncu={nQ zx0@OACLPC++9TdkW8?8U+usw0F4!eUJZTB1?_WPmjmIZ3fsv|w?=JFED!-oMk^x03 z-7D`1L*loRv3k+3lb1`+?-Qo{*Lic;laMpFjOiPn3ja2G-9sCn(DIR3FsYK*8&1N1 z%l~*Ukv)BskXTlQ?2ojsbQG%Mk{=X(AR&AZLX{k6mZ_}Em)Ut#mYPYkOoMhOP(2nM zNr$$V22KaU7@X$Pd*7r>v5bOcJ^y;1VnU5V@NtoNrV&@^y8ELj$8_s_d3;X7QHjyj z{i&Y?Uu_>xcHv9$c|RKMmvd|z&MX!iiC>i>9N);y{Oxnf)nTr#Z%zQ|REOFl#a}jn zC7eg{?LrcxM*IMr9KHHng*gWLJZ~>)NfkEJrmOkohTJwn=t<(}I44*MvDEQ%WBqLt zio9m*-xZ{UrLP*8?X<6Ej^$2f#Wa?#@>24M!W8^AN(?ml#>}frYK{~|T&Jip9npiL zQpgHJ$MmTA(Bd0Q4Hs{-EcP2q75|o=8@oa5{!aHS;%?4{{c@ z+8qx~^BIY7tw2qETRm6yYHR67rI({nX`T9`(y0YQ4)qjiS)rN|z?@9X5FYGJrE$6l zk>^{VM(ba=`&o2$SJSk@O17AYIlujU!n=3izPt&QfSz&`4cIw4xENAbgakCMZ{1TI z+uTdk)S)->sFk67)kiuJH=iQxWL3tWWs>q?RHQjvb<)H(p?3sIx<)_zTFU*rT6VcJ zugeKl9HD6h%j|08f8@a0sEvp%4&K~z>|WR}D~44L;_SFD6B5mWaBFYpgCR_8 q&Pg{68;o0e2mv4lpw@;i;cm_vb%-z&zaNHxkEg2Ik5S5&@BRniYwRch literal 145910 zcmYIvbyQSg_caJghagIaDBayHBi$fUA{|3_N`n&8k|WX}4MTTH4n1`D(A|8O_kDls z`(qZaS=YJuKF>M(?7h!Xk&uv&k&sYP&|d)GxT_NU1O8w* zeAIPDLV82+^g*_Oi~(0sBgx4~YI+#%Wq77je3-m!om{wFoViRQIq}brglUsa;i2bE`_RV~v``^50 z_jF5msqZV<&N_=EUg+X069-GlGm?YwL$gpBa}u7lIg$tCf5f0hen~-tjf_T4jjF#w zO+T-ZYz^Ij;RNQHns@ktO7aXq0GDi@a)&FBn zKnn9E!Rj(Tfx36L1%_OQkZ`Y;4*Kop@%$)}t4NEVDgsqQKbkUh zstT1V5Py`Y1=i!IdPAuK{x(99qQ+PVLg!+Xb3?9W5xrLA7HINslyOyG_CCPw61l^* z2A!Nfjx{G-IJ(ZDSO~p?nn{MnwP~&3L88wg2fy@8pZ^u^2atg0ia=25+F5<+IAmyj zN`S=P%vtaBv0z;ur8+!J$&vYW>jl2j<`j61OB3%$I`CVK7Cl+-BgQ#M1%I>e6cB)e7 zje?D78-Lf^^tFfs=8KUr=xygTQ6S1gDssx*3TF=bxHge9;Ik%`FTRLa;oh{ zzoB`dp*J@LYs}e=wP9^|4x;?ZYqw(0B>B>^KCwLeIkfSXp5;hCSt?6{E?.F<0( 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

${C+M~c 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 YC!wOxnyol`fCaqNRkWYiC|O1Q9|vQ0)&Kwi -- Gitee From d9e556abe47aa8204b8e71c1aba377898a340126 Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Sat, 29 Nov 2025 17:51:47 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=E5=A4=A7=E6=96=87=E4=BB=B6=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- .../src/main/ets/pages/BigJsonFileDecodePage.ets | 15 ++++++++++++--- entry/src/main/resources/base/element/string.json | 6 +----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets index d95403c..3c99768 100644 --- a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets +++ b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets @@ -29,6 +29,10 @@ export default struct BigJsonFileDecodePage { context = this.getUIContext().getHostContext(); private jsonFiles: string[] = [ 'citylots.json'// JSON file download address https://github.com/zemirco/sf-city-lots-json + // 'employees_100MB.json' // https://sample.json-format.com/ + // 'employees_200MB.json' // https://sample.json-format.com/ + // 'employees_300MB.json' // https://sample.json-format.com/ + ]; private currentJsonFile: string = ''; private json: Uint8Array | null = null; @@ -109,7 +113,7 @@ export default struct BigJsonFileDecodePage { // Test conversion to business object duration // In practice, you may only need to use JsonNode lazy loading for child nodes - const obj:ESObject = await jsonNode.toPlainObjectAsync(); + const obj: ESObject = await jsonNode.toPlainObjectAsync(); // Calculate duration const endTime = systemDateTime.getTime(true); @@ -120,8 +124,13 @@ export default struct BigJsonFileDecodePage { // Update result this.success = true; - const keys = jsonNode.jsonObject().keys(); - this.result = $r('app.string.file_analyze_success', Array.from(keys).length, this.duration.toFixed(2)); + if (jsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const keys = jsonNode.jsonObject().keys(); + this.result = $r('app.string.file_analyze_success', Array.from(keys).length, this.duration.toFixed(2)); + } else if (jsonNode.jsonType() === JsonNodeType.JSON_ARRAY) { + this.result = + $r('app.string.file_analyze_success', jsonNode.jsonArray().getCapacity(), this.duration.toFixed(2)); + } this.promptAction.showToast({ message: $r('app.string.file_analyze_success_toast') diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json index 3b7a134..28dddf1 100644 --- a/entry/src/main/resources/base/element/string.json +++ b/entry/src/main/resources/base/element/string.json @@ -177,13 +177,9 @@ "name": "close_fail" }, { - "value": "%s序列化%s", + "value": "序列化", "name": "serialization" }, - { - "value": "%s反序列化%s", - "name": "deserialization" - }, { "value": "修改Person属性:", "name": "modify_person_label" -- Gitee From b41d724b2feb787e6c4502f097458b6eeac6cef2 Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Mon, 1 Dec 2025 16:23:26 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=E9=A1=B5=E9=9D=A2=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=86=85=E5=AE=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- .../ets/pages/NetworkAndObservedV2Page.ets | 18 ++++----------- .../src/main/ets/pages/NetworkRequestPage.ets | 22 ++++++------------- entry/src/main/ets/pages/WithSendablePage.ets | 17 +++++++++----- 3 files changed, 23 insertions(+), 34 deletions(-) diff --git a/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets b/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets index 19d4534..a21be0a 100644 --- a/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets +++ b/entry/src/main/ets/pages/NetworkAndObservedV2Page.ets @@ -43,6 +43,10 @@ export default struct NetworkAndObservedV2Page { @Local selectKey: string = ''; @Local inputValue: string = ''; + aboutToDisappear(): void { + TcpServerUtil.close() + } + async requestData() { if (!this.serverIsCreated) { this.promptAction.showToast({ @@ -168,20 +172,6 @@ export default struct NetworkAndObservedV2Page { } .width(PageConstants.FULL_WIDTH) } - Button($r('app.string.close_server')) - .attributeModifier(new ButtonStyles()) - .onClick(() => { - TcpServerUtil.close().then(() => { - this.serverIsCreated = false; - this.promptAction.showToast({ - message: $r('app.string.closed') - }) - }).catch(() => { - this.promptAction.showToast({ - message: $r('app.string.close_fail') - }) - }) - }) } } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/NetworkRequestPage.ets b/entry/src/main/ets/pages/NetworkRequestPage.ets index e99959d..bdc74ed 100644 --- a/entry/src/main/ets/pages/NetworkRequestPage.ets +++ b/entry/src/main/ets/pages/NetworkRequestPage.ets @@ -30,6 +30,11 @@ export default struct NetworkRequestPage { @State serverIsCreated: boolean = TcpServerUtil.isCreate; @State requestParams: string = ''; @State person: Person | null = null; + @State serverData: ResourceStr = $r('app.string.log_display_placeholder'); + + aboutToDisappear(): void { + TcpServerUtil.close() + } async requestData() { if (!this.serverIsCreated) { @@ -61,7 +66,7 @@ export default struct NetworkRequestPage { CardContainer({ cardType: CardType.isLog, title: $r('app.string.server_data'), - content: TJSON.toString(users, { classKey: 'Array', genericTypes: [Person] }) + content: this.serverData }) Text() { @@ -98,6 +103,7 @@ export default struct NetworkRequestPage { .onClick(() => { TcpServerUtil.create().then(() => { this.serverIsCreated = true; + this.serverData = TJSON.toString(users, { classKey: 'Array', genericTypes: [Person] }); this.promptAction.showToast({ message: $r('app.string.open_server_success') }) @@ -131,20 +137,6 @@ export default struct NetworkRequestPage { .onClick(async () => { this.requestData() }) - Button($r('app.string.close_server')) - .attributeModifier(new ButtonStyles()) - .onClick(() => { - TcpServerUtil.close().then(() => { - this.serverIsCreated = false; - this.promptAction.showToast({ - message: $r('app.string.closed') - }) - }).catch(() => { - this.promptAction.showToast({ - message: $r('app.string.close_fail') - }) - }) - }) } } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/WithSendablePage.ets b/entry/src/main/ets/pages/WithSendablePage.ets index a9573a8..9a4cca0 100644 --- a/entry/src/main/ets/pages/WithSendablePage.ets +++ b/entry/src/main/ets/pages/WithSendablePage.ets @@ -58,13 +58,20 @@ export default struct WithSendablePage { content: CodeExample.CROSS_THREAD_USAGE }); CardContainer({ - cardType: CardType.isLog, - content: this.person ? $r('app.string.serialization', - `person.name: ${this.person?.name}\n` + + cardType: CardType.isLog + }) { + if (this.person) { + Span(`person.name: ${this.person?.name}\n` + `person.age: ${this.person?.age}\n` + `person.sex: ${this.person?.sex}\n` + - `person.scores: ${this.person?.scores}\n`, `: ${this.personStr}`) : $r('app.string.log_display_placeholder') - }); + `person.scores: ${this.person?.scores}\n`) + Span($r('app.string.serialization')) + Span(`: ${this.personStr}`) + } else { + Span($r('app.string.log_display_placeholder')) + } + } + Button($r('app.string.execute_the_serialization_method')) .attributeModifier(new ButtonStyles()) .onClick(() => { -- Gitee From 64aa1c2dffebb6614061567d5763bd7cd0bd8247 Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Tue, 2 Dec 2025 16:38:37 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=92=8C=E5=8F=82=E6=95=B0=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- entry/src/main/ets/pages/BigJsonFileDecodePage.ets | 6 +++--- hvigorfile.ts | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets index 3c99768..6befbb5 100644 --- a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets +++ b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets @@ -194,9 +194,9 @@ export default struct BigJsonFileDecodePage { } for (let index = 0; index < keys.length; index++) { - const firstKey = keys[index]; - let firstValue: ESObject = jsonNode.jsonObject().get(firstKey); - log += this.generateLogContent(firstValue, value + '.' + firstKey, depth + 1); + const key = keys[index]; + let childJsonNode = jsonNode.jsonObject().get(key); + log += this.generateLogContent(childJsonNode, value + '.' + key, depth + 1); } return log; } diff --git a/hvigorfile.ts b/hvigorfile.ts index 33c4c3b..c4d38cd 100644 --- a/hvigorfile.ts +++ b/hvigorfile.ts @@ -7,10 +7,6 @@ export default { system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ plugins: [ appPlugin({ ignoreModuleNames: [] }), - turboTransJsonPlugin(hvigor, { - ignoreModuleNames: [/** Module names that do not need to be scanned, e.g.: 'SomeLibModule' */], - scanDir: ['src/main/ets'], - deserializationMode: 'performance', // Deserialization mode, optional values: 'performance' | 'strict' - }), - ] /* Custom plugin to extend the functionality of Hvigor. */ + turboTransJsonPlugin(hvigor), + ] } \ No newline at end of file -- Gitee From 78f0cf5abcada9668af0d94ec5c3bc57c160085f Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Tue, 2 Dec 2025 19:07:34 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- entry/src/main/ets/model/Person.ets | 5 ++- .../src/main/ets/model/PersonWithSendable.ets | 5 ++- .../main/ets/pages/BigJsonFileDecodePage.ets | 37 ++++++++++++++----- .../src/main/ets/pages/NetworkRequestPage.ets | 6 +++ entry/src/main/ets/pages/WithSendablePage.ets | 8 +++- hvigor/hvigor-config.json5 | 6 ++- hvigorfile.ts | 12 ++++-- 7 files changed, 60 insertions(+), 19 deletions(-) diff --git a/entry/src/main/ets/model/Person.ets b/entry/src/main/ets/model/Person.ets index 15ffa36..cf39a72 100644 --- a/entry/src/main/ets/model/Person.ets +++ b/entry/src/main/ets/model/Person.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start definedNormalClass] import { Serializable } from "@hadss/turbo-trans-core"; @Serializable() @@ -28,4 +28,5 @@ export class Person { this.sex = sex; this.scores = scores; } -} \ No newline at end of file +} +// [End definedNormalClass] \ No newline at end of file diff --git a/entry/src/main/ets/model/PersonWithSendable.ets b/entry/src/main/ets/model/PersonWithSendable.ets index bcd9b44..e42957e 100644 --- a/entry/src/main/ets/model/PersonWithSendable.ets +++ b/entry/src/main/ets/model/PersonWithSendable.ets @@ -12,7 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +// [Start definedSendableClass] import { Serializable } from "@hadss/turbo-trans-core"; @Serializable({ generateSendable: true }) @@ -28,4 +28,5 @@ export class PersonWithSendable { this.sex = sex; this.scores = scores; } -} \ No newline at end of file +} +// [End definedSendableClass] \ No newline at end of file diff --git a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets index 6befbb5..a638c6c 100644 --- a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets +++ b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets @@ -107,13 +107,16 @@ export default struct BigJsonFileDecodePage { // Record start time const startTime = systemDateTime.getTime(true); - // Perform parsing - let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); + // [Start bigFileReadDemo] + let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); // this.json.buffer is read citylots.json buffer + // [End bigFileReadDemo] this.json = null; // Test conversion to business object duration // In practice, you may only need to use JsonNode lazy loading for child nodes + // [Start bigFileToPlainObject] const obj: ESObject = await jsonNode.toPlainObjectAsync(); + // [Start bigFileToPlainObject] // Calculate duration const endTime = systemDateTime.getTime(true); @@ -163,25 +166,31 @@ export default struct BigJsonFileDecodePage { if (depth > 1) { return '' } - const jsonType = jsonNode.jsonType(); - if (jsonType === JsonNodeType.JSON_NULL) { - return this.getString($r('app.string.analyze_is_null')); - } let log = this.getString($r('app.string.analyze_layers'), depth); + + // [Start jsonNodeDemo] + const jsonType = jsonNode.jsonType(); if (jsonType === JsonNodeType.JSON_ARRAY) { + // [StartExclude jsonNodeDemo] log += this.getString($r('app.string.analyze_is_array'), jsonNode.jsonArray().getCapacity()) - log += this.generateLogContent(jsonNode.jsonArray().get(0), '[0]', depth + 1); + // [StartExclude jsonNodeDemo] + const firstNode = jsonNode.jsonArray().get(0); + // [StartExclude jsonNodeDemo] + log += this.generateLogContent(firstNode, '[0]', depth + 1); + // [StartExclude jsonNodeDemo] return log; } else if (jsonType === JsonNodeType.JSON_OBJECT) { + // [StartExclude jsonNodeDemo] const keys = Array.from(jsonNode.jsonObject().keys()); log += this.getString($r('app.string.analyze_is_object'), keys.length) log += this.getString($r('app.string.analyze_before_three')) const count = Math.min(3, keys.length); for (let i = 0; i < count; i++) { const key = keys[i]; + // [EndExclude jsonNodeDemo] let value = jsonNode.jsonObject().get(key); + // [StartExclude jsonNodeDemo] log += `{${key}: `; - if (value.jsonType() === JsonNodeType.JSON_ARRAY) { log += `Array[${value.jsonArray().getCapacity()}]}\n`; } else if (value.jsonType() === JsonNodeType.JSON_OBJECT) { @@ -199,8 +208,18 @@ export default struct BigJsonFileDecodePage { log += this.generateLogContent(childJsonNode, value + '.' + key, depth + 1); } return log; + // [EndExclude jsonNodeDemo] + } else if (jsonType === JsonNodeType.JSON_PRIMITIVE) { + const str = jsonNode.jsonPrimitive().toString(); + // [StartExclude jsonNodeDemo] + return log + this.getString($r('app.string.analyze_is_primitive'), str); + // [EndExclude jsonNodeDemo] + } else { + // [StartExclude jsonNodeDemo] + return this.getString($r('app.string.analyze_is_null')); + // [EndExclude jsonNodeDemo] } - return log + this.getString($r('app.string.analyze_is_primitive'), jsonNode.jsonPrimitive().toString()); + // [End jsonNodeDemo] } build() { diff --git a/entry/src/main/ets/pages/NetworkRequestPage.ets b/entry/src/main/ets/pages/NetworkRequestPage.ets index bdc74ed..cfdb67d 100644 --- a/entry/src/main/ets/pages/NetworkRequestPage.ets +++ b/entry/src/main/ets/pages/NetworkRequestPage.ets @@ -43,17 +43,23 @@ export default struct NetworkRequestPage { }) return } + // [Start deserializeDemo] + // [StartExclude deserializeDemo] const session = rcp.createSession(); const request = new rcp.Request(`http://${TcpServerUtil.address}:${TcpServerUtil.port}?name=${this.requestParams}`); + // [EndExclude deserializeDemo] const response = await session.fetch(request); if (response && response.body) { this.person = TJSON.fromBuffer(response.body, Person); } else { + // [StartExclude deserializeDemo] this.person = null; this.promptAction.showToast({ message: $r('app.string.server_return_empty') }) + // [EndExclude deserializeDemo] } + // [Start deserializeDemo] } build() { diff --git a/entry/src/main/ets/pages/WithSendablePage.ets b/entry/src/main/ets/pages/WithSendablePage.ets index 9a4cca0..a611290 100644 --- a/entry/src/main/ets/pages/WithSendablePage.ets +++ b/entry/src/main/ets/pages/WithSendablePage.ets @@ -20,11 +20,13 @@ import { ButtonStyles, CardContainer, CardType, CodeExample, LayoutContainer } f import { PageRouteConstants } from '../common/constants/PageRouteConstants'; import { PersonWithSendable } from '../model/PersonWithSendable'; +// [Start definedChildTask] @Concurrent function childThreadTask() { const person = new PersonWithSendable('John', 20, 'man', [1, 2, 3]); return (person as object as ITSerializable).toSendable() } +// [End definedChildTask] @HMRouter({ pageUrl: PageRouteConstants.WITH_SENDABLE_PAGE }) @Component @@ -32,11 +34,13 @@ export default struct WithSendablePage { @State person: PersonWithSendable | null = null; @State personStr: string = ''; - async buildLogString() { + async execSerialize() { + // [Start execChildTaskWithSendable] const task: taskpool.Task = new taskpool.Task(childThreadTask); const data = await taskpool.execute(task); this.person = TJSON.toOrigin(data); this.personStr = TJSON.toString(this.person, PersonWithSendable); + // [End execChildTaskWithSendable] } build() { @@ -75,7 +79,7 @@ export default struct WithSendablePage { Button($r('app.string.execute_the_serialization_method')) .attributeModifier(new ButtonStyles()) .onClick(() => { - this.buildLogString() + this.execSerialize() }) } } diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index b3744b6..6a4c0df 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,9 +1,13 @@ { "modelVersion": "6.0.0", + // [Start dependPlugin] "dependencies": { + // [StartExclude dependPlugin] "@hadss/hmrouter-plugin": "^1.2.2", + // [EndExclude dependPlugin] "@hadss/turbo-trans-json-plugin": "^1.0.0-rc.0" - }, + } // [End dependPlugin] +, "execution": { // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | "ultrafine" | false ]. Default: "normal" */ // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ diff --git a/hvigorfile.ts b/hvigorfile.ts index c4d38cd..00c0f5b 100644 --- a/hvigorfile.ts +++ b/hvigorfile.ts @@ -1,12 +1,18 @@ +// [Start configPlugin] import { hvigor } from "@ohos/hvigor"; import { appTasks } from '@ohos/hvigor-ohos-plugin'; import { turboTransJsonPlugin } from "@hadss/turbo-trans-json-plugin"; +// [StartExclude configPlugin] import { appPlugin } from "@hadss/hmrouter-plugin"; +// [EndExclude configPlugin] export default { - system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + system: appTasks, plugins: [ + // [StartExclude configPlugin] appPlugin({ ignoreModuleNames: [] }), - turboTransJsonPlugin(hvigor), + // [EndExclude configPlugin] + turboTransJsonPlugin(hvigor) ] -} \ No newline at end of file +} +// [End configPlugin] \ No newline at end of file -- Gitee From c79234879477698bcb428aae37b0fc5cd023673d Mon Sep 17 00:00:00 2001 From: zhujiayun Date: Tue, 2 Dec 2025 19:45:50 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=90=8C?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhujiayun --- README.md | 1 + entry/src/main/ets/model/CityLots.ets | 62 +++++++++++++++++++ .../main/ets/pages/BigJsonFileDecodePage.ets | 42 +++++++++---- entry/src/main/ets/utils/Logger.ets | 2 +- hvigor/hvigor-config.json5 | 4 +- 5 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 entry/src/main/ets/model/CityLots.ets diff --git a/README.md b/README.md index 1013caf..13177e5 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ entry/src/main/ets // 代码区 ├── entryability │ └── EntryAbility.ets // 应用入口ability ├── model +│ └── CityLots.ets // 示例数据结构-citylots.json大文件内子节点对象 │ └── Person.ets // 示例数据结构-普通Person类 │ └── PersonWithObservedV2.ets // 示例数据结构-带ObservedV2和Sendable的Person类 │ └── PersonWithSendable.ets // 示例数据结构-Sendable的Person类 diff --git a/entry/src/main/ets/model/CityLots.ets b/entry/src/main/ets/model/CityLots.ets new file mode 100644 index 0000000..fc52b01 --- /dev/null +++ b/entry/src/main/ets/model/CityLots.ets @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Serializable, SerialName } from "@hadss/turbo-trans-core"; + +@Serializable() +export class CityLotsProperty { + @SerialName({name: 'MAPBLKLOT'}) + mapBlkLot: string = ''; + @SerialName({name: 'BLKLOT'}) + blkLot: string = ''; + @SerialName({name: 'BLOCK_NUM'}) + blockNum: string = ''; + @SerialName({name: 'LOT_NUM'}) + lotNum: string = ''; + @SerialName({name: 'FROM_ST'}) + fromST: string = ''; + @SerialName({name: 'TO_ST'}) + toST: string = ''; + @SerialName({name: 'STREET'}) + street: string = ''; + @SerialName({name: 'ST_TYPE'}) + stType: string = ''; + @SerialName({name: 'ODD_EVEN'}) + oddEven: string = '' +} + +@Serializable() +export class CityLotsGeometry { + type: string; + coordinates: Array>>; + constructor(type: string, coordinates: Array>>) { + this.type = type; + this.coordinates = coordinates; + } +} + +// [Start CityLotsDefined] +@Serializable() +export class CityLots { + type: string; + properties: CityLotsProperty; + geometry: CityLotsGeometry; + constructor(type: string, properties: CityLotsProperty,geometry: CityLotsGeometry) { + this.type = type; + this.properties = properties; + this.geometry = geometry; + } +} +// [End CityLotsDefined] \ No newline at end of file diff --git a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets index a638c6c..aa79b8e 100644 --- a/entry/src/main/ets/pages/BigJsonFileDecodePage.ets +++ b/entry/src/main/ets/pages/BigJsonFileDecodePage.ets @@ -21,6 +21,8 @@ import { ButtonStyles, CardContainer, CardType, LayoutContainer, PageConstants } from '../common'; import { PageRouteConstants } from '../common/constants/PageRouteConstants'; +import { CityLots } from '../model/CityLots'; +import Logger from '../utils/Logger'; @HMRouter({ pageUrl: PageRouteConstants.BIG_JSONFILE_DECODE_PAGE }) @Component @@ -108,7 +110,8 @@ export default struct BigJsonFileDecodePage { const startTime = systemDateTime.getTime(true); // [Start bigFileReadDemo] - let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); // this.json.buffer is read citylots.json buffer + // this.json.buffer is read citylots.json buffer + let jsonNode = TJSON.toJsonNodeFromBuffer(this.json.buffer); // [End bigFileReadDemo] this.json = null; @@ -116,12 +119,25 @@ export default struct BigJsonFileDecodePage { // In practice, you may only need to use JsonNode lazy loading for child nodes // [Start bigFileToPlainObject] const obj: ESObject = await jsonNode.toPlainObjectAsync(); - // [Start bigFileToPlainObject] + // [End bigFileToPlainObject] // Calculate duration const endTime = systemDateTime.getTime(true); this.duration = (endTime - startTime) / 1e6; + // [Start jsonNodeAtDemo] + // json structure {features: [{ ... }]} + const featureJsonNode = jsonNode.at('/features/0'); + // [Start jsonNodeAtDemo] + // [Start fromJsonNodeDemo] + if (featureJsonNode.jsonType() === JsonNodeType.JSON_OBJECT) { + const cityLots = TJSON.fromJsonNode(featureJsonNode, CityLots); + Logger.info(`cityLots.cityLots`, cityLots.type); + Logger.info(`cityLots.geometry.type ${cityLots.geometry.type}`); + Logger.info(`cityLots.geometry.coordinates.length ${cityLots.geometry.coordinates.length}`); + } + // [End fromJsonNodeDemo] + // Generate log content this.logContent = this.generateLogContent(jsonNode); @@ -163,7 +179,7 @@ export default struct BigJsonFileDecodePage { // Method to generate log content private generateLogContent(jsonNode: JsonNode, value: string = '', depth: number = 0): string { - if (depth > 1) { + if (depth > 2) { return '' } let log = this.getString($r('app.string.analyze_layers'), depth); @@ -173,23 +189,21 @@ export default struct BigJsonFileDecodePage { if (jsonType === JsonNodeType.JSON_ARRAY) { // [StartExclude jsonNodeDemo] log += this.getString($r('app.string.analyze_is_array'), jsonNode.jsonArray().getCapacity()) - // [StartExclude jsonNodeDemo] + // [EndExclude jsonNodeDemo] const firstNode = jsonNode.jsonArray().get(0); // [StartExclude jsonNodeDemo] log += this.generateLogContent(firstNode, '[0]', depth + 1); - // [StartExclude jsonNodeDemo] return log; + // [EndExclude jsonNodeDemo] } else if (jsonType === JsonNodeType.JSON_OBJECT) { - // [StartExclude jsonNodeDemo] const keys = Array.from(jsonNode.jsonObject().keys()); + // [StartExclude jsonNodeDemo] log += this.getString($r('app.string.analyze_is_object'), keys.length) log += this.getString($r('app.string.analyze_before_three')) - const count = Math.min(3, keys.length); + const count = Math.min(3, keys.length); // 解析前三个属性 for (let i = 0; i < count; i++) { const key = keys[i]; - // [EndExclude jsonNodeDemo] - let value = jsonNode.jsonObject().get(key); - // [StartExclude jsonNodeDemo] + const value = jsonNode.jsonObject().get(key); log += `{${key}: `; if (value.jsonType() === JsonNodeType.JSON_ARRAY) { log += `Array[${value.jsonArray().getCapacity()}]}\n`; @@ -201,12 +215,15 @@ export default struct BigJsonFileDecodePage { log += `${value}}\n`; } } - + // [EndExclude jsonNodeDemo] for (let index = 0; index < keys.length; index++) { const key = keys[index]; - let childJsonNode = jsonNode.jsonObject().get(key); + const childJsonNode = jsonNode.jsonObject().get(key); + // [StartExclude jsonNodeDemo] log += this.generateLogContent(childJsonNode, value + '.' + key, depth + 1); + // [EndExclude jsonNodeDemo] } + // [StartExclude jsonNodeDemo] return log; // [EndExclude jsonNodeDemo] } else if (jsonType === JsonNodeType.JSON_PRIMITIVE) { @@ -215,6 +232,7 @@ export default struct BigJsonFileDecodePage { return log + this.getString($r('app.string.analyze_is_primitive'), str); // [EndExclude jsonNodeDemo] } else { + // This jsonNode type is null // [StartExclude jsonNodeDemo] return this.getString($r('app.string.analyze_is_null')); // [EndExclude jsonNodeDemo] diff --git a/entry/src/main/ets/utils/Logger.ets b/entry/src/main/ets/utils/Logger.ets index 07e84f7..a5f46fe 100644 --- a/entry/src/main/ets/utils/Logger.ets +++ b/entry/src/main/ets/utils/Logger.ets @@ -18,7 +18,7 @@ import hilog from '@ohos.hilog'; class Logger { private domain: number; private prefix: string; - private format: string = '%{public}s, %{public}s'; + private format: string = '%{public}s'; constructor(prefix: string) { this.prefix = prefix; diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index 6a4c0df..fc82a25 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -6,8 +6,8 @@ "@hadss/hmrouter-plugin": "^1.2.2", // [EndExclude dependPlugin] "@hadss/turbo-trans-json-plugin": "^1.0.0-rc.0" - } // [End dependPlugin] -, + }, + // [End dependPlugin] "execution": { // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | "ultrafine" | false ]. Default: "normal" */ // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ -- Gitee