HarmonyOS 鸿蒙Next 使用fillClass无法把json中的字典转为Map
HarmonyOS 鸿蒙Next 使用fillClass无法把json中的字典转为Map
1、原始的json数据为
{
“total”: 5,
“detail”: {
“4531b420-1117-11ef-91b7-c1504ea5e19a”: 3,
“1e169160-0e1f-11e7-8c5c-15b1be8e5981”: 2
}
}
2、本地的对象为
export class BadgeUnreadCountBean {
total: number = 0;
detail: Map<string, number> = new Map()
}
3、期望detail会转为map,实际detail为null
let webAppCountBean:BadgeUnreadCountBean = fillClass(new BadgeUnreadCountBean(),为1的object)
三方库版本: “@wolfx/fill_class”: “1.1.2”
更多关于HarmonyOS 鸿蒙Next 使用fillClass无法把json中的字典转为Map的实战教程也可以访问 https://www.itying.com/category-93-b0.html
reflect-metadata 地址: https://ohpm.openharmony.cn/#/cn/detail/reflect-metadata
class-transformer 地址: https://ohpm.openharmony.cn/#/cn/detail/class-transformer
// Index.ets
let jsonString:Record<string, ESObject> = {
“data” : [
{
<span class="hljs-string">"number"</span> :<span class="hljs-number">1</span>,
<span class="hljs-string">"age"</span>: <span class="hljs-number">20</span>,
<span class="hljs-string">"testA"</span>: {
<span class="hljs-string">"str"</span> : <span class="hljs-string">"123"</span>
}
},
{
<span class="hljs-string">"number"</span> :<span class="hljs-number">2</span>,
<span class="hljs-string">"age"</span>: <span class="hljs-number">21</span>,
<span class="hljs-string">"testA"</span>: {
<span class="hljs-string">"str"</span> : <span class="hljs-string">"456"</span>
}
}
]
}
import { Type, plainToClass } from ‘class-transformer’
import ‘reflect-metadata’
import { TestA, Person, ViewA} from ‘./ViewA’;
class ResponseObj {
@Type (() => Person)
data: Person[] = [];
}
struct Index {
@State list: Person[] = [];
@State message: string = ‘Click me’;
build() {
Row() {
Column() {
Text(<span class="hljs-keyword">this</span>.message).fontSize(<span class="hljs-number">40</span>).onClick(() => {
<span class="hljs-keyword">let</span> responseObj : ResponseObj = plainToClass(ResponseObj, jsonString);
console.log( ${responseObj.data[<span class="hljs-number">0</span>] <span class="hljs-keyword">instanceof</span> Person})
<span class="hljs-keyword">this</span>.list = <span class="hljs-keyword">this</span>.list.concat(responseObj.data);
})
ForEach(<span class="hljs-keyword">this</span>.list, (item : Person, index: number) => {
ViewA({index:index, test
item.testA})
})
}
.width(<span class="hljs-string">'100%'</span>)
}
.height(<span class="hljs-string">'100%'</span>)
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
// ViewA.ets
import { Type } from ‘class-transformer’
export class TestA {
public str : string
constructor(str: string) {
this.str = str;
}
}
export class Person {
name: string = ‘’
age: number = 1
@Type(()=>TestA)
test
TestA = new TestA(’’)
}
export struct ViewA {
@ObjectLink test
TestA
index: number = -1;
build() {
Row(){
Button(View A ${this.testA.str}).onClick(() =>{
this.index += 1;
this.testA.str = ${this.index} : Test A String
})
}.margin({top : 10 })
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
使用ohpm 引入三方库
ohpm install class-transformer
ohpm install reflect-metadata
三方库@wolfx/fill_class 实现的是 将 JSON 数据填充到 class 对象中,不支持转换为Map
更多关于HarmonyOS 鸿蒙Next 使用fillClass无法把json中的字典转为Map的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,若使用fillClass
方法无法将JSON中的字典转为Map
,通常是因为类型匹配或数据格式问题。以下是可能的原因及处理方法:
-
确保JSON数据格式正确:
- JSON字典的键和值必须使用双引号包裹。
- 确保JSON数据本身没有语法错误。
-
检查
Map
的定义:- 确保
Map
的泛型类型正确,例如Map<String, Any>
,其中Any
可以容纳各种数据类型。
- 确保
-
使用正确的反序列化方法:
- 使用HarmonyOS提供的JSON反序列化工具(如
JSONUtil
),确保工具版本与HarmonyOS版本兼容。
- 使用HarmonyOS提供的JSON反序列化工具(如
-
示例代码:
val jsonString = "{\"key1\":\"value1\", \"key2\":123}" val map: Map<String, Any> = JSONUtil.toBean(jsonString, Map::class.java) as Map<String, Any>
-
检查
fillClass
方法的调用:- 确保
fillClass
方法被正确调用,并且传入的参数类型与期望的Map
类型一致。
- 确保
如果上述方法均无法解决问题,可能是HarmonyOS版本或特定环境下的兼容性问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html