1# 使用JSVM-API接口进行JSON操作
2
3## 简介
4
5使用JSVM-API接口对JSON数据操作时,相关接口可以在JSVM模块中直接操作和处理JSON格式的数据。
6
7## 基本概念
8
9- **JSON( JavaScript Object Notation)**:是一种常见的数据交换格式,可用于实现前后端之间的数据传递、存储和交流,并且可以与多种编程语言进行交互,在JavaScript中被广泛应用于数据处理。
10
11## 接口说明
12
13| 接口                       | 功能说明                       |
14|----------------------------|--------------------------------|
15| OH_JSVM_JsonParse          | 解析JSON字符串,并将结果存储在JSON对象。 |
16| OH_JSVM_JsonStringify      | 将对象字符串化,并将结果存储在JSVM字符串对象。 |
17
18## 使用示例
19
20JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。
21
22### OH_JSVM_JsonParse && OH_JSVM_JsonStringify
23
24对JSON对象进行解析操作,并输出解析结果的有效值。
25
26cpp部分代码
27
28```cpp
29// hello.cpp
30#include <string>
31
32// 待执行的js代码
33static const char *STR_TASK = R"JS(jsonParseNumber();jsonParseObject();)JS";
34
35// 解析JSON数字
36static JSVM_Value JsonParseNumber(JSVM_Env env, JSVM_CallbackInfo info)
37{
38    // 设置要解析的JSON数字
39    std::string strNumber = "10.555";
40    JSVM_Value jsonString;
41    JSVM_CALL(OH_JSVM_CreateStringUtf8(env, strNumber.c_str(), strNumber.size(), &jsonString));
42    JSVM_Value jsonObject;
43    // 调用OH_JSVM_JsonParse函数解析JSON数字,并将结果存储在JSON对象中
44    JSVM_CALL(OH_JSVM_JsonParse(env, jsonString, &jsonObject));
45    double number;
46    JSVM_CALL(OH_JSVM_GetValueDouble(env, jsonObject, &number));
47    OH_LOG_INFO(LOG_APP, "Test JSVM jsonParseNumber: %{public}f", number);
48    return nullptr;
49}
50
51// 解析JSON字符串中的对象
52static JSVM_Value JsonParseObject(JSVM_Env env, JSVM_CallbackInfo info)
53{
54    // 设置要解析的JSON对象字符串
55    std::string strObject = "{\"first\": \"one\", \"second\": \"two\", \"third\": \"three\"}";
56    JSVM_Value strJson;
57    JSVM_CALL(OH_JSVM_CreateStringUtf8(env, strObject.c_str(), strObject.size(), &strJson));
58    JSVM_Value jsonObject;
59    // 调用OH_JSVM_JsonParse函数解析JSON对象字符串,并将结果存储在JSON对象中
60    JSVM_CALL(OH_JSVM_JsonParse(env, strJson, &jsonObject));
61    JSVM_Value jsonString;
62    // 调用OH_JSVM_JsonStringify函数将对象转换为字符串格式,并将结果存储在JSVM字符串对象中
63    JSVM_CALL(OH_JSVM_JsonStringify(env, jsonObject, &jsonString));
64    size_t totalLen = 0;
65    JSVM_CALL(OH_JSVM_GetValueStringUtf8(env, jsonString, nullptr, 0, &totalLen));
66    size_t needLen = totalLen + 1;
67    char* buff = new char[needLen];
68    JSVM_CALL(OH_JSVM_GetValueStringUtf8(env, jsonString, buff, needLen, &totalLen));
69    OH_LOG_INFO(LOG_APP, "Test JSVM jsonParseNumber: %{public}s", buff);
70    delete[] buff;
71    return nullptr;
72}
73
74// JsonParse注册回调
75static JSVM_CallbackStruct param[] = {
76    {.data = nullptr, .callback = JsonParseNumber},
77    {.data = nullptr, .callback = JsonParseObject},
78};
79
80static JSVM_CallbackStruct *method = param;
81
82JSVM_PropertyDescriptor descriptor[] = {
83    {"jsonParseNumber", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
84    {"jsonParseObject", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
85};
86
87```
88
89## 预期结果
90
91Test JSVM jsonParseNumber: 10.555000
92
93Test JSVM jsonParseNumber: {"first":"one","second":"two","third":"three"}
94
95