【C++】JSON文件的读取和生成

转载:https://my.oschina.net/Tsybius2014/blog/289527

一、从字符串中读取JSON

a.cpp

#include <iostream>

#include "json/json.h"

using namespace std;

int main()
{
    //字符串
    const char* str = 
        "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
        "\"born\":-100,\"died\":-44}";

    Json::Reader reader;
    Json::Value root;

    //从字符串中读取数据
    if(reader.parse(str,root))
    {
        string praenomen = root["praenomen"].asString();
        string nomen = root["nomen"].asString();
        string cognomen = root["cognomen"].asString();
        int born = root["born"].asInt();
        int died = root["died"].asInt();

        cout << praenomen + " " + nomen + " " + cognomen
            << " was born in year " << born 
            << ", died in year " << died << endl;
    }

    return 0;
}


makefile文件

LIB=-L/usr/local/lib/libjson/ -ljson_linux-gcc-4.4.7_libmt

a: a.o
    g++ -o a -std=c++0x a.o $(LIB)
a.o: a.cpp 
    g++ -c a.cpp
clean:
    rm -rf a.o a

运行结果

二、从文件中读取JSON

PersonalInfo.json(一个存储了JSON格式字符串的文件)

{
    "name":"Tsybius",
    "age":23,
    "sex_is_male":true,
    "partner":
    {
        "partner_name":"Galatea",
        "partner_age":21,
        "partner_sex_is_male":false
    },
    "achievement":["ach1","ach2","ach3"]
}

a.cpp

#include <iostream>
#include <fstream>

#include "json/json.h"

using namespace std;

int main()
{
    Json::Reader reader;
    Json::Value root;

    //从文件中读取
    ifstream is;
    is.open("PersonalInfo.json", ios::binary);

    if(reader.parse(is,root))
    {
        //读取根节点信息
        string name = root["name"].asString();
        int age = root["age"].asInt();
        bool sex_is_male = root["sex_is_male"].asBool();

        cout << "My name is " << name << endl;
        cout << "I'm " << age << " years old" << endl;
        cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;

        //读取子节点信息
        string partner_name = root["partner"]["partner_name"].asString();
        int partner_age = root["partner"]["partner_age"].asInt();
        bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();

        cout << "My partner's name is " << partner_name << endl;
        cout << (partner_sex_is_male ? "he" : "she") << " is "
            << partner_age << " years old" << endl;

        //读取数组信息
        cout << "Here's my achievements:" << endl;
        for(int i = 0; i < root["achievement"].size(); i++)
        {
            string ach = root["achievement"][i].asString();
            cout << ach << '\t';
        }
        cout << endl;

        cout << "Reading Complete!" << endl;
    }

    is.close();

    return 0;
}

makefile

LIB=-L/usr/local/lib/libjson/ -ljson_linux-gcc-4.4.7_libmt

a: a.o
    g++ -o a -std=c++0x a.o $(LIB)
a.o: a.cpp 
    g++ -c a.cpp
clean:
    rm -rf a.o a

运行结果

三、将信息保存为JSON格式

a.cpp

#include <iostream>
#include <fstream>

#include "json/json.h"

using namespace std;

int main()
{
    //根节点
    Json::Value root;

    //根节点属性
    root["name"] = Json::Value("Tsybius");
    root["age"] = Json::Value(23);
    root["sex_is_male"] = Json::Value(true);

    //子节点
    Json::Value partner;

    //子节点属性
    partner["partner_name"] = Json::Value("Galatea");
    partner["partner_age"] = Json::Value(21);
    partner["partner_sex_is_male"] = Json::Value(false);

    //子节点挂到根节点上
    root["partner"] = Json::Value(partner);

    //数组形式
    root["achievement"].append("ach1");
    root["achievement"].append("ach2");
    root["achievement"].append("ach3");
    
    //直接输出
    cout << "FastWriter:" << endl;
    Json::FastWriter fw;
    cout << fw.write(root) << endl << endl;

    //缩进输出
    cout << "StyledWriter:" << endl;
    Json::StyledWriter sw;
    cout << sw.write(root) << endl << endl;
    
    //输出到文件
    ofstream os;
    os.open("PersonalInfo");
    os << sw.write(root);
    os.close();

    return 0;
}

makefile

LIB=-L/usr/local/lib/libjson/ -ljson_linux-gcc-4.4.7_libmt

a: a.o
    g++ -o a -std=c++0x a.o $(LIB)
a.o: a.cpp 
    g++ -c a.cpp
clean:
    rm -rf a.o a

运行结果

生成的文件PersonalInfo.json

{
   "achievement" : [ "ach1", "ach2", "ach3" ],
   "age" : 23,
   "name" : "Tsybius",
   "partner" : {
      "partner_age" : 21,
      "partner_name" : "Galatea",
      "partner_sex_is_male" : false
   },
   "sex_is_male" : true
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C标准库不直接支持读取和写入JSON文件的功能,但可以使用第三方库来实现。 以下是一些常用的C语言JSON库: 1. cJSON:一个轻量级的JSON解析和生成库。可以在GitHub上下载。 2. Jansson:一个C语言的JSON库,支持解析和生成JSON数据。可以在GitHub上下载。 3. YAJL:一个快速的JSON解析器/生成器库,支持流式处理JSON数据。可以在GitHub上下载。 使用这些库可以方便地读取和写入JSON文件。例如,使用cJSON库可以通过以下方式读取JSON文件: ``` #include <stdio.h> #include <cJSON.h> int main() { FILE *file = fopen("data.json", "r"); if (file) { fseek(file, 0, SEEK_END); long size = ftell(file); fseek(file, 0, SEEK_SET); char *buffer = (char*)malloc(size + 1); fread(buffer, 1, size, file); fclose(file); buffer[size] = '\0'; cJSON *json = cJSON_Parse(buffer); free(buffer); if (json) { // 处理JSON数据 cJSON_Delete(json); } else { printf("Error: Failed to parse JSON file."); } } else { printf("Error: Failed to open JSON file."); } return 0; } ``` 使用cJSON库可以通过以下方式将JSON数据写入文件: ``` #include <stdio.h> #include <cJSON.h> int main() { cJSON *json = cJSON_CreateObject(); cJSON_AddStringToObject(json, "name", "John"); cJSON_AddNumberToObject(json, "age", 30); char *jsonString = cJSON_Print(json); cJSON_Delete(json); FILE *file = fopen("output.json", "w"); if (file) { fputs(jsonString, file); fclose(file); } else { printf("Error: Failed to open output file."); } free(jsonString); return 0; } ``` 这些代码示例可以帮助您开始使用JSON读取和写入JSON文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值