使用JSVM-API接口进行JSON操作
====================

#### 简介

使用JSVM-API接口操作JSON数据时，JSVM模块中的相关接口可以直接处理JSON格式的数据。

#### 基本概念

*   **JSON（JavaScript Object Notation）**：是一种常见的数据交换格式，用于前后端数据的传递、存储和交流。可以与多种编程语言进行交互，在JavaScript中被广泛应用于数据处理。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_JsonParse | 解析JSON字符串，并将结果存储在JSON对象。 |
| OH\_JSVM\_JsonStringify | 将对象字符串化，并将结果存储在JSVM字符串对象。 |

#### 使用示例

JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)，本文仅展示接口对应的C++相关代码。

#### \[h2\]OH\_JSVM\_JsonParse & OH\_JSVM\_JsonStringify

解析JSON对象，并输出有效的解析结果。

cpp部分代码：

// hello.cpp
#include <string>

// 解析JSON数字
static JSVM\_Value JsonParseNumber(JSVM\_Env env, JSVM\_CallbackInfo info)
{
    // 设置要解析的JSON数字
    std::string strNumber = "10.555";
    JSVM\_Value jsonString = nullptr;
    JSVM\_CALL(OH\_JSVM\_CreateStringUtf8(env, strNumber.c\_str(), strNumber.size(), &jsonString));
    JSVM\_Value jsonObject = nullptr;
    // 调用OH\_JSVM\_JsonParse函数解析JSON数字，并将结果存储在JSON对象中
    JSVM\_CALL(OH\_JSVM\_JsonParse(env, jsonString, &jsonObject));
    double number = 0.0f;
    JSVM\_CALL(OH\_JSVM\_GetValueDouble(env, jsonObject, &number));
    OH\_LOG\_INFO(LOG\_APP, "Test JSVM jsonParseNumber: %{public}f", number);
    return nullptr;
}

// 解析JSON字符串中的对象
static JSVM\_Value JsonParseObject(JSVM\_Env env, JSVM\_CallbackInfo info)
{
    // 设置要解析的JSON对象字符串
    std::string strObject = "{\\"first\\": \\"one\\", \\"second\\": \\"two\\", \\"third\\": \\"three\\"}";
    JSVM\_Value strJson = nullptr;
    JSVM\_CALL(OH\_JSVM\_CreateStringUtf8(env, strObject.c\_str(), strObject.size(), &strJson));
    JSVM\_Value jsonObject = nullptr;
    // 调用OH\_JSVM\_JsonParse函数解析JSON对象字符串，并将结果存储在JSON对象中
    JSVM\_CALL(OH\_JSVM\_JsonParse(env, strJson, &jsonObject));
    JSVM\_Value jsonString = nullptr;
    // 调用OH\_JSVM\_JsonStringify函数将对象转换为字符串格式，并将结果存储在JSVM字符串对象中
    JSVM\_CALL(OH\_JSVM\_JsonStringify(env, jsonObject, &jsonString));
    size\_t totalLen = 0;
    JSVM\_CALL(OH\_JSVM\_GetValueStringUtf8(env, jsonString, nullptr, 0, &totalLen));
    size\_t needLen = totalLen + 1;
    char\* buff = new char\[needLen\];
    JSVM\_CALL(OH\_JSVM\_GetValueStringUtf8(env, jsonString, buff, needLen, &totalLen));
    OH\_LOG\_INFO(LOG\_APP, "Test JSVM jsonParseObject: %{public}s", buff);
    delete\[\] buff;
    return nullptr;
}

// JsonParse注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsonParseNumber},
    {.data = nullptr, .callback = JsonParseObject},
};

static JSVM\_CallbackStruct \*method = param;

JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsonParseNumber", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
    {"jsonParseObject", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};

// 待执行的js代码
static const char \*srcCallNative = R"JS(jsonParseNumber();jsonParseObject();)JS";

#### 预期结果：

Test JSVM jsonParseNumber: 10.555000

Test JSVM jsonParseObject: {"first":"one","second":"two","third":"three"}