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

2 回复
参考以下demo实现,通过引入三方库 reflect-metadata 和 class-transformer 来实现json对象转指定实例

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[] = [];

}

@Entry

@Component

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(() =&gt; {

      <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) =&gt; {

      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’

@Observed

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(’’)

}

@Component

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,通常是因为类型匹配或数据格式问题。以下是可能的原因及处理方法:

  1. 确保JSON数据格式正确

    • JSON字典的键和值必须使用双引号包裹。
    • 确保JSON数据本身没有语法错误。
  2. 检查Map的定义

    • 确保Map的泛型类型正确,例如Map<String, Any>,其中Any可以容纳各种数据类型。
  3. 使用正确的反序列化方法

    • 使用HarmonyOS提供的JSON反序列化工具(如JSONUtil),确保工具版本与HarmonyOS版本兼容。
  4. 示例代码

    val jsonString = "{\"key1\":\"value1\", \"key2\":123}"
    val map: Map<String, Any> = JSONUtil.toBean(jsonString, Map::class.java) as Map<String, Any>
    
  5. 检查fillClass方法的调用

    • 确保fillClass方法被正确调用,并且传入的参数类型与期望的Map类型一致。

如果上述方法均无法解决问题,可能是HarmonyOS版本或特定环境下的兼容性问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部