HarmonyOS鸿蒙Next中网络返回JSON数据在本地如何定义适配的数据模型

HarmonyOS鸿蒙Next中网络返回JSON数据在本地如何定义适配的数据模型

数据模型类:

export interface IHistoryList{
  title:string  
  lsDate:string  
}
export class CHistory {
  code: number //成功代码200
  msg: string //成功success
  data: Array<IHistoryList>

  //构造函数
  constructor(
    code: number //成功代码200
    , msg: string //成功success
    , data: Array<IHistoryList>
    ) {
    this.code = code
    this.msg = msg
    this.data = data
  }
}

网络获取数据代码如下:

let httpRequest = http.createHttp()
//console.log('MyTag string=',Constant.historyAPI+selectDate)
httpRequest.request(Constant.historyAPI, {
  method: http.RequestMethod.GET,
  //header: {},
  //expectDataType:http.HttpDataType.OBJECT,
  readTimeout: 6000,
  connectTimeout: 6000,
}, (
  err: BusinessError, data: http.HttpResponse
) => {
  if (!err) {
    //获取数据成功
    console.info('MyTag 申请数据成功。history data=',JSON.stringify(data.result))

    this.history=JSON.parse(data.result.toString()) as CHistory
    console.info('MyTag history.code=',this.history.code)
    console.info('MyTag history.code=',this.history.msg)
    //console.info('MyTag history.code=',this.history.data)
    //console.info('MyTag history.code=',this.history.code)
    //销毁,释放资源
    httpRequest.destroy()
  } else {
    //获取数据失败
    console.info('MyTag 获取数据失败,', JSON.stringify(err))
    //销毁,释放资源
    httpRequest.destroy()
  }
})

通过网络获取到数据,结果如下:

11-17 08:53:23.398  3948-11092  A0c0d0/JSAPP  I   MyTag 申请数据成功。data= "{\"code\":200,\"msg\":\"success\",\"data\":{\"list\":[{\"title\":\"《我是谁\",\"lsdate\":\"1085-01-01\"},{\"title\":\"草原\",\"lsdate\":\"1863-01-01\"}}]}"

在转换使用时出现如下错误:

11-17 08:53:23.417  3948-11092  C03f00/ArkCompiler     E   [ArkRuntime Log] TypeError: is not callable
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]Lifetime: 0.000000s
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]Js-Engine: ark
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]page: pages/Index.js
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]Error message: is not callable
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]Stacktrace:
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at forEachUpdateFunction (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4339:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at anonymous (entry|entry|1.0.0|src/main/ets/pages/Index.ts:311:25)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at updateFunc (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6776:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at observeComponentCreation2 (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6817:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at anonymous (entry|entry|1.0.0|src/main/ets/pages/Index.ts:271:21)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at ifElseBranchUpdateFunction (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:4286:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at anonymous (entry|entry|1.0.0|src/main/ets/pages/Index.ts:270:17)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at updateFunc (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6776:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at UpdateElement (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6496:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at anonymous (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6719:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at updateDirtyElements (/mnt/disk/workspace/jenkins_cd_pool_high_001/harmony/foundation/arkui/ace_engine/frameworks/bridge/declarative_frontend/engine/stateMgmt.js:6714:1)
11-17 08:53:23.418  3948-11092  C03900/Ace              E   [Engine Log]    at rerender (entry|entry|1.0.0|src/main/ets/pages/Index.ts:328:9)

请问如何定义数据模型类才能与返回的数据匹配?


更多关于HarmonyOS鸿蒙Next中网络返回JSON数据在本地如何定义适配的数据模型的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
this.history=JSON.parse(JSON.stringify(data.result)) as CHistory

这里不要用data.result.toString(),使用JSON.stringify(data.result)就可以了

更多关于HarmonyOS鸿蒙Next中网络返回JSON数据在本地如何定义适配的数据模型的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,网络返回的JSON数据可以通过定义适配的数据模型进行解析。数据模型通常使用TypeScript或JavaScript的类或接口来定义。假设网络返回的JSON数据如下:

{
    "id": 1,
    "name": "HarmonyOS",
    "version": "Next"
}

你可以定义一个对应的数据模型类:

class AppInfo {
    id: number;
    name: string;
    version: string;

    constructor(id: number, name: string, version: string) {
        this.id = id;
        this.name = name;
        this.version = version;
    }
}

或者使用接口来定义:

interface AppInfo {
    id: number;
    name: string;
    version: string;
}

在接收到网络返回的JSON数据后,可以通过以下方式将其映射到定义的数据模型:

let jsonData = '{"id": 1, "name": "HarmonyOS", "version": "Next"}';
let parsedData = JSON.parse(jsonData);

let appInfo: AppInfo = {
    id: parsedData.id,
    name: parsedData.name,
    version: parsedData.version
};

这样,appInfo对象就包含了JSON数据中的内容,并且类型安全地映射到了定义的数据模型。

在HarmonyOS鸿蒙Next中,网络返回的JSON数据可以通过定义数据类(Data Class)来适配。首先,根据JSON结构创建对应的Kotlin数据类,使用@Serializable注解标记该类。然后,使用Json.decodeFromString方法将JSON字符串反序列化为数据类对象。例如:

import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

@Serializable
data class User(val id: Int, val name: String)

fun main() {
    val json = """{"id": 1, "name": "Alice"}"""
    val user = Json.decodeFromString<User>(json)
    println(user)
}

这样,JSON数据就能与本地数据模型匹配,方便后续操作。

回到顶部