json 文件的装、配置、测试使用

本文详细介绍了JSON数据格式及其在C++中的应用,包括如何使用JsonCpp库进行JSON对象和数组的创建、访问及解析。通过实例展示了如何从字符串解析JSON并写入文件,以及从文件读取JSON数据。此外,还提供了配置JsonCpp库在VS2015中的步骤。
摘要由CSDN通过智能技术生成

jSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于阅读和理解,也易于机器解析和生成.

 JSON构建于两种结构:

  1. "名称/值"对的集合(A collection of name/value pairs).在不同的语言中被理解为对象(Object),记录(Records),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者是关联数组(associative array)
  2. 值得有序列表(An ordered list of values),在大部分语言中被理解为数据(array)

JSON的形式

  1. 对象

  对象是一个无序的"'名称/值'对"集合.一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

      2.数组 

  数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间间使用“,”(逗号)分隔

字符串一定要用双引号括起来

 数组中可以嵌套数组和对象

{

"name": "BeJson",

    "url": "http://www.bejson.com",

    "page": 88,

    "isNonProfit": true,

    "address": {

        "street": "科技园路.",

        "city": "江苏苏州",

        "country": "中国"

    },

    "links": [

        {

            "name": "Google",

            "url": "http://www.google.com"

        },

        {

            "name": "Baidu",

            "url": "http://www.baidu.com"

        },

        {

            "name": "SoSo",

            "url": "http://www.SoSo.com"

        }

    ]

}

解析json的工具办法:使用第三方jsoncpp

1.直接网上下载:

参考C++中使用JsonCpp - 简书。这个参考是是从git下载,用python 实现的,我没有python。

使用该链接: https://pan.baidu.com/s/1dSf7154_fuudvt_OYe4IZg 提取码: i3pu 

或者是找到旧版直接用vs编译出静态链接库即 json-cpp - Browse /jsoncpp/0.6.0-rc2 at SourceForge.net 选中下载jsoncpp-src-0.6.0-rc2

2.安装、配置、测试过程 

a.编译出一个静态链接库.lib  在这里会生成json_vc71_libmtd.lib

b.测试,建一个新工程,引入jsoncpp的头文件、库文件

c.更换MTD工程->属性->配置属性->c/c+±>代码生成->运行库,设置运行库为多线程调试 (/MTd)

具体可参考VS2015配置jsoncpp详解_hpuzsk的博客-CSDN博客_jsoncpp vs2015

 另外的一种办法.在vs2017中通过NuGet直接安装jsoncpp到项目下(该方法不成功,编译出现很多bug)

在浏览中输入jsoncpp,选中jsoncpp下载。会在项目下有个package包,这个包下面就是jsoncpp库。

 搜索安装过程如下

正在尝试收集与目标为“native,Version=v0.0”的项目“stdtest”有关的包“jsoncpp.0.6.0.1”的依赖项信息
收集依赖项信息花费时间 366.22 ms
正在尝试解析程序包“jsoncpp.0.6.0.1”的依赖项,DependencyBehavior 为“Lowest”
解析依赖项信息花费时间 0 ms
正在解析操作以安装程序包“jsoncpp.0.6.0.1”
已解析操作以安装程序包“jsoncpp.0.6.0.1”
从“nuget.org”检索包“jsoncpp 0.6.0.1” 
从“nuget.org”检索包“jsoncpp.redist 0.6.0.1” 
  GET https://api.nuget.org/v3-flatcontainer/jsoncpp.redist/0.6.0.1/jsoncpp.redist.0.6.0.1.nupkg
  GET https://api.nuget.org/v3-flatcontainer/jsoncpp/0.6.0.1/jsoncpp.0.6.0.1.nupkg
  OK https://api.nuget.org/v3-flatcontainer/jsoncpp.redist/0.6.0.1/jsoncpp.redist.0.6.0.1.nupkg 863 毫秒
  OK https://api.nuget.org/v3-flatcontainer/jsoncpp/0.6.0.1/jsoncpp.0.6.0.1.nupkg 916 毫秒
正在安装 jsoncpp.redist 0.6.0.1。
正在安装 jsoncpp 0.6.0.1。
正在将程序包“jsoncpp.redist.0.6.0.1”添加到文件夹“F:\test\stdtest\packages”
已将程序包“jsoncpp.redist.0.6.0.1”添加到文件夹“F:\test\stdtest\packages”
已将程序包“jsoncpp.redist.0.6.0.1”添加到“packages.config”
已将“jsoncpp.redist 0.6.0.1”成功安装到 stdtest
正在将程序包“jsoncpp.0.6.0.1”添加到文件夹“F:\test\stdtest\packages”
已将程序包“jsoncpp.0.6.0.1”添加到文件夹“F:\test\stdtest\packages”
已将程序包“jsoncpp.0.6.0.1”添加到“packages.config”
已将“jsoncpp 0.6.0.1”成功安装到 stdtest
执行 nuget 操作花费时间 5.41 sec
已用时间: 00:00:06.0361098

这种方法(我并没有成功,一堆字link error)。

另外第三种方法:其实这种方法就是第一种,只是生成的lib文件名字改了一下。同时下面的这个参考的没有.project文件,不适用于vs软件。最好还是第一种办法好。

可参考:windows C++ vs任何版本 jsoncpp配置教程_THE XING-CSDN博客

测试的例子:

    json Value的新建及key的访问 


    cout << "json Value的新建及key的访问" << endl;
    // 新建Json::Value对象
    Json::Value value1;
    // 给字段赋值,key必须为string型
    // 类似STL的map,访问一个不存在的字段时会自动新建一个字段    
    value1["name"] = "英语";                // string型

    Json::Value value2;
    value2["name"] = "语文";        // string型
    value2["score"] = 80;            // 整型
    value2["right"] = true;            // bool型
    value2["percent"] = 12.34567890;    // double型
    value2["count"];                    // 单纯的访问一个key,由于该key不存在,所以会新建,值的类型为Json::nullValue
 
                                        // 新建Value对象
    Json::Value valueArr;
    valueArr["name"] = "json array";    // string型
    valueArr["object"] = value1;        // json::Value型
    valueArr["array"].append("array_element_one");    // 访问key为"array",该key不存在,会新建,类型为Json::arrayValue,数组型,且把第一个元素赋值为string型"array element one"
    valueArr["array"].append("array_element_two");    // 该key已存在,往后面增加元素,赋值为string型"array element two"
    valueArr["array"].append(33333);                // 该key已存在,往后面增加元素,赋值为整型33333
    valueArr["array"].append(value2);                // 该key已存在,往后面增加元素,赋值为json::Value型
 
                                                    // 计算其中字段的个数
    cout << "size = " << valueArr.size() << endl;
 
    // key的访问
 
    // 访问字段"object"的值,访问一个key前,先预判是否有该key
    if (valueArr.isMember("object"))
    {
        // 存在的话,再判断其value的类型是否是自己预期的,根据前面32行赋值代码可知:"object"的值是Json::Value类型
        if (valueArr["object"].isObject())
        {
            // 转换成对应的类型
            Json::Value object = valueArr["object"];
 
            // 字段检测,取值,可以放在一行中,谨记:先检测是否存在,后判断类型
            if (object.isMember("name") && object["name"].isString())
            {
                string name = object["name"].asString();
                cout << "valueArr[object] key = name, value = " << name.c_str() << endl;
            }
        }
    }
 
    // 访问字段"array"的值
    if (valueArr.isMember("array") && valueArr["array"].isArray()) // 根据前面33行赋值代码可知:"object"的值是Json::arrayValue类型的
    {
        // 注意:虽然类型为Json::arrayValue,也是转换为Json::Value类型的
        Json::Value arrayObject = valueArr["array"];
 
        // 得到其元素个数
        int array_size = arrayObject.size();
 
        // 根据类型,逐个输出元素
        for (int i = 0; i<array_size; i++)
        {
            // 若是Json::Value型
            if (arrayObject[i].isObject())
            {
                // 转换成对应的类型
                Json::Value object = arrayObject[i];
 
                // 字段检测,取值
                if (object.isMember("score") && object["score"].isInt())
                {
                    int score = object["score"].asInt();
                    cout << "valueArr[array][" << i << "]" << " key = score, value = " << score << endl;
                }
 
                // 字段检测,取值
                if (object.isMember("percent") && object["percent"].isDouble())
                {
                    double percent = object["percent"].asDouble();
                    cout << "valueArr[array][" << i << "]" << " key = percent, value = " << percent << endl;
                }
            }
 
            // 若是string类型
            if (arrayObject[i].isString())
            {
                cout << "valueArr[array][" << i << "] value is " << arrayObject[i].asString() << endl;
            }
 
            // 若是整型
            if (arrayObject[i].isInt())
            {
                cout << "valueArr[array][" << i << "] value is " << arrayObject[i].asInt() << endl;
            }
        }
    }
    cout << "\n\n" << endl;

    从字符串中解析出json::Value       

             

    cout << "从字符串中解析出json::Value" << endl;
    // 要解析的json字符串
    std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":999},{\"key2\":\"value4\"}]}";
 
    // json对象
    Json::Value value3;
 
    // 开始解析json,解析后的json对象存储在value中,成功返回true
    Json::Reader reader;
    if (reader.parse(strValue, value3))
    {
        // 字段key1
        if (value3.isMember("key1") && value3["key1"].isString())
        {
            cout << "value3[key1] = " << value3["key1"].asString() << endl;
        }
 
        // 字段array
        if (value3.isMember("array") && value3["array"].isArray())
        {
            Json::Value valueArray = value3["array"];
 
            for (int i = 0; i<valueArray.size(); i++)
            {
                if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isString())
                {
                    cout << "value3[array][" << i << "].[key2] = " << valueArray[i]["key2"].asString() << endl;
                }
 
                if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isInt())
                {
                    cout << "value3[array][" << i << "].[key2] = " << valueArray[i]["key2"].asInt() << endl;
                }
            }
        }
    }
    cout << "\n\n" << endl;

   把json::Value写入到文件中     

                  

    cout << "把json::Value写入到文件中" << endl;
 
    ofstream ofs;
    ofs.open("test.json");
 
    // 第一种办法:直接输出,带缩进,效果等同于第三种办法
    //ofs << valueArr.toStyledString();
 
 
    // 第二种办法:快速输出,没有格式
    //Json::FastWriter fw;
    //ofs<<fw.write(valueArr)<<endl;
 
    // 第三种办法:缩进输出
    Json::StyledWriter sw;
    ofs << sw.write(valueArr) << endl;
 
    ofs.close();
    cout << "输出到文件完毕" << endl;
    cout << "\n\n" << endl;

写入文件后,test.json文件内容如下

{
   "array" : [
      "array_element_one",
      "array_element_two",
      33333,
      {
         "count" : null,
         "name" : "语文",
         "percent" : 12.34567890,
         "right" : true,
         "score" : 80
      }
   ],
   "name" : "json array",
   "object" : {
      "name" : "英语"
   }
}

从文件中读取json::Value                            //



    cout << "从文件中读取到json:value" << endl;
    ifstream ifs;
    ifs.open("test.json");
 
    Json::Value value4;
 
    Json::Reader jsonReader;
    if (jsonReader.parse(ifs, value4))
    {
        // 得到字段的个数
        cout << "size = " << value4.size() << endl;
 
        // 访问
        if (valueArr.isMember("name") && valueArr["name"].isString())
        {
            cout << "valueArr[name] = " << valueArr["name"].asString() << endl;
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VSCode配置tasks.json文件的步骤如下: 1. 打开VSCode,点击左侧菜单栏的“查看”按钮,选择“命令面板”或者使用快捷键“Ctrl+Shift+P”打开命令面板。 2. 在命令面板中输入“tasks.json”,选择“配置任务”选项,点击回车。 3. 在弹出的任务配置窗口中,选择“创建任务文件”选项,点击回车。 4. 在弹出的文件选择窗口中,选择“tasks.json文件,点击回车。 5. 在打开的“tasks.json文件中,可以配置各种任务,例如编译、运行、测试等。 6. 配置完成后,保存文件并关闭。 7. 在VSCode的左侧菜单栏中,选择“运行”按钮,选择需要运行的任务即可。 以上就是VSCode配置tasks.json文件的步骤。 ### 回答2: Task 是 VS Code 中一个非常重要的功能,可以帮助开发者在工程项目中自动化执行一些任务,比如编译、运行、测试等,提高开发效率。而 tasks.json 文件是 VS Code Task 的配置文件,包含任务的具体配置信息。 一、如何配置 tasks.json 文件 打开 VS Code,使用快捷键 Ctrl + Shift + P 或者 Command + Shift + P,输入 “Tasks: Configure Task” 进入 Tasks 配置界面,选择 “Create tasks.json file from templates” 并按下 Enter 键,选择相应的模板创建 tasks.json 文件。 二、tasks.json 文件的基本语法 示例如下: { // task 1 - 编译 TypeScript "version": "2.0.0", "tasks": [ { "label": "TypeScript Build", "type": "typescript", "tsconfig": "./tsconfig.json", "problemMatcher": [ "$tsc" ] }, // task 2 - 运行 Node.js { "label": "Run Node.js", "type": "shell", "command": "node ./src/app.js", "problemMatcher": [] } ] } - version:tasks.json 文件的版本号,目前只支持 2.0.0 版本。 - tasks:tasks 数组,每个元素都表示一个任务条目。 三、tasks.json 文件中的常用配置项 - label:任务名称。 - command:要执行的命令。 - args:传递给命令的参数。 - type:Task 的类型,有 shell 和 process 两种。 - options:执行命令时的选项。 - cwd:设置运行命令时的工作目录。 - problemMatcher:设置错误和警告的匹配规则。 - dependsOn:设置当前任务依赖的任务。 - group:设置当前任务所属的任务组别。 四、常用任务示例 1. 编译 TypeScript: { "label": "build", "command": "tsc", "args": [ "-p", "." ], "type": "shell", "group": "build", "presentation": { "reveal": "always" }, "problemMatcher": "$tsc" } 2. 运行 Python: { "label": "run", "command": "python", "args": [ "${file}" ], "type": "shell", "problemMatcher": [] } 3. 调试 TypeScript: { "label": "debug", "type": "node", "request": "launch", "name": "Launch Program", "program": "${workspaceFolder}/dist/app.js", "args": [], "outFiles": [ "${workspaceFolder}/dist/**/*.js" ], "preLaunchTask": "build", "sourceMaps": true, "smartStep": true, "problemMatcher": "$tsc" } 综上所述,tasks.json 文件是 VS Code 中非常重要的一个配置文件,通过对该文件进行配置,可以使你的开发工作变得更加高效和自动化。开发者们找到适合自己的 task 配置方法,将可以更好地进行项目开发。 ### 回答3: VS Code是一款流行的开源代码编辑器,它提供了全面的功能,包括调试、语法高亮、代码提示、版本控制等。对于开发者来说,tasks.json是一项非常重要的配置文件之一,它可以让开发者自定义代码的编译和运行方式。下面我们来详细了解一下如何配置tasks.json文件。 一、tasks.json简介 tasks.json文件定义了一组任务,每个任务都是与某个可执行程序相关联的一系列操作。它可以执行自定义的编译、运行、测试、打包等操作,从而提高代码开发的效率。tasks.json文件通常存在于.vscode目录下,如果该目录下没有tasks.json文件,则可以手动创建一个空的文件进行配置。 二、tasks.json的基本结构 tasks.json文件由一个JSON对象组成。每个任务由一个对象描述,包含以下结构: { // 任务名称 "label": "Build Project", // 命令或脚本 "command": "make", // 命令参数 "args": [ "all" ], // 输入和输出目录 "cwd": "${workspaceRoot}", // 是否在任务完成后自动显示输出结果 "showOutput": "always", // Windows系统使用的命令Shell "windows": { "command": "powershell.exe", "args": [ "get-childitem" ] }, // Linux和MacOS系统使用的命令Shell "linux": { "command": "bash", "args": [ "-c", "ls" ] }, // 任务类型 "type": "shell" } 以上是一个完整的任务结构体,其中,label是任务名称,command和args是要执行的命令和参数,cwd是指定执行该命令的目录,showOutput标识是否显示输出,windows和linux是不同系统下执行该命令的配置,type指定了任务类型,shell类型表示该任务是直接执行指定的命令。 三、如何编写tasks.json VS Code提供了一个简单的任务绑定功能,可以通过键盘快捷键Ctrl+Shift+B直接触发。当点击任务时,它将执行用户定义的Tasks配置。 首先,在.vscode目录下创建tasks.json文件,在其中输入以下JSON结构: { "version": "2.0.0", "tasks": [ { "label": "Compile", "type": "shell", "command": "tsc", "options": { "cwd": "${workspaceFolder}", "shell": true }, "problemMatcher": [ "$tsc" ] } ] } - version:定义tasks.json的版本号,当前版本为2.0.0。 - tasks:定义所有任务的数组,每个任务使用一个JSON对象描述。 - label:为任务指定一个用户友好的名称。 - type:任务的类型,通常是“shell”类型,表示该任务使用终端执行命令。 - command:定义要执行的命令。 - options:定义命令执行时的选项。在该示例中,使用cwd指定命令执行时的工作目录。shell设置为true后,将使用环境SHELL变量代替默认的cmd.exe或powershell.exe。 - problemMatcher:指定问题匹配器。在该示例中,使用$tsc问题匹配器匹配 TypeScript 编译器输出的错误信息。 四、如何使用tasks.json 配置完成后重新启动VS Code,使用Ctrl+Shift+B快捷键或菜单栏任务调用快捷键,就可以运行tasks.json文件中的任务。需要注意的是,调用任务之前必须保存当前文件。如果在编辑器中运行任务,每个任务将在输出面板上显示其运行结果。 五、任务的高级配置 除了上述基本配置,tasks.json还支持其他一些高级配置: - dependsOn:定义该任务依赖的其他任务的标签。如下代码所示: "dependsOn": ["Task1", "Task2"] - group:定义任务在侧边栏中的分组,例如“build”、“test”、“deploy”等。 - presentation:定义任务的展示方式。例如以下代码所示,使用reveal表示执行任务之后将焦点放在终端输出上。 "presentation": { "reveal": "always" } - promptOnClose:处理具有未保存缓冲区的工作区文件的关闭提示。可以设置为true、false或save。如果设置为true,则任何未保存的文件都将提示保存。如果设置为false,则关闭提示将被禁用。设置为save将仅提示保存正在编辑的文件。默认值为null。 总之,tasks.json是VS Code中非常重要的环节,它可以让我们定制化自己的编译、运行等环节,大大提高了我们的开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值