使用Jsoncpp生成和解析Json字符串

2023-11-08

       上一篇,同大家一起分享了QJson的移植(Qt4.8.3)、使用技巧(如何移植和使用QJson),本篇我们来熟悉下使用Jsoncpp生成和解析Json字符串。当然作为Qt的狂热爱好者,我还是会继续改造Jsoncpp项目,来一个Qt项目版。需要下载对应项目资源的朋友,可以在文末点击链接下载。回归到正题上来。

一、Jsoncpp下载

下载路径 https://sourceforge.net/projects/jsoncpp/

二、jsoncpp项目改造与库文件生成

我们还是先改造下项目,使jsoncpp变成我们熟悉的Qt项目,通过Qt构建和编译生成Jsoncpp.dll库文件。

1、在下载和解压jsoncpp-master源码后,我们自己定义一个jsoncpp的Qt项目目录。 先将源码中 include目录下的json文件夹 拷贝到 jsoncpp文件夹中,然后将src目录下lib_json中的所有文件拷贝到jsoncpp下的 json 文件夹中。如下图:

 

2、新建一个.pro文件,编写文件内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2017-12-09T14:36:16
#
#-------------------------------------------------

TARGET = jsoncpp

TEMPLATE = lib
CONFIG += shared
CONFIG += dll


CONFIG += exceptions

# 指定包含的头文件路径,否则对应使用<>引用的头文件会报错
INCLUDEPATH += ./

# 指定生成库的目标文件路径
DESTDIR = ./lib

#Mingw
#win32-g++{
#    BINDIR = ../win32-gcc-bin
#}

##Vs2010
#win32-msvc2010{
#    BINDIR = ../../vs2010-bin
#}

##arm-linux
#linux-arm-g++{
#    BINDIR = ../arm-linux-gcc-bin

#    DEFINES += __NO_PRECOMPILED_HEADER__
#    DEFINES += _TTY_POSIX_
#}

#CONFIG(debug, debug|release){
#    DESTDIR = $$BINDIR/debug
#}else{
#    DESTDIR = $$BINDIR/release
#}

SOURCES += \
    json/json_internalarray.inl \
    json/json_internalmap.inl \
    json/json_reader.cpp \
    json/json_value.cpp \
    json/json_valueiterator.inl \
    json/json_writer.cpp



HEADERS +=\
    json/autolink.h \
    json/config.h \
    json/features.h \
    json/forwards.h \
    json/json.h \
    json/json_batchallocator.h \
    json/reader.h \
    json/value.h \
    json/writer.h

    

3、使用Qt打开我们的jsoncpp.pro工程文件,可取消影子构建,然后构建和编译项目,在lib目录下可生成对应的.dll 和.a 库文件。

三、jsoncpp生成和解析json字符串 演示

1、首先新建一个jsoncppTest的Qt控制台项目。运行下项目。然后我们将jsoncpp.dll和.a库文件拷贝到 jsoncppTest项目的Relaese目录下。在pro文件中添加库文件链接。

#-------------------------------------------------
#
# Project created by QtCreator 2020-05-19T08:50:19
#
#-------------------------------------------------

QT       += core

QT       -= gui

INCLUDEPATH += ./json

TARGET = jsoncppTest
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

LIBS += -L$$PWD/release/ -ljsoncpp

2、准备工作已经做好,接下来我们在main.cpp中进行功能测试。因为比较简单,不做过多解释,直接看代码吧。

#include <QCoreApplication>
#include "json/json.h"
#include "json/reader.h"
#include "json/value.h"
#include "json/writer.h"

#include <QString>
#include <QDebug>


// deamon以如下json的生成和解析为例,来演示jsoncpp的用法
/*
 * QString json("{"
             "\"encoding\" : \"UTF-8\","
             "\"plug-ins\" : [\"python\",\"c++\",\"ruby\"],"
             "\"types\":[{\"A\":1,\"B\":5},{\"A\":2,\"B\":6}],"
             "\"indent\" : { \"length\" : 3, \"use_space\" : true }"
             "}");
*/

QString generate_json_string(){


    Json::Value root;
    Json::Value arr_plug;
    Json::Value arr_types;
    Json::Value val;

    // 处理json对象
    // [1] encoding
    root["encoding"] = "UTF-8";

    // [2] indent
    root["indent"]["length"] = 3;
    root["indent"]["use_space"] = true;

    // 处理json数组
    // [3] plug-ins
    arr_plug.append("python");
    arr_plug.append("c++");
    arr_plug.append("ruby");

    root["plug-ins"] = arr_plug;

    // [4] types
    val["A"] = 1;
    val["B"] = 5;
    arr_types.append(val);

    val["A"] = 2;
    val["B"] = 6;
    arr_types.append(val);

    root["types"] = arr_types;

    // 生成json字符串
    Json::StyledWriter sw;
    QString string = QString::fromStdString(sw.write(root));
    return string;
}



void parsing_json_string(QString json_string){
    Json::Reader reader;
    Json::Value value;
    if(reader.parse(json_string.toStdString(),value))
    {

        /*
         * Int asInt() const;
         * UInt asUInt() const;
         * double asDouble() const;
         * bool asBool() const;
         *
         * bool isNull() const;
         * bool isBool() const;
         * bool isInt() const;
         * bool isUInt() const;
         * bool isIntegral() const;
         * bool isDouble() const;
         * bool isNumeric() const;
         * bool isString() const;
         * bool isArray() const;
         * bool isObject() const;

      bool isConvertibleTo( ValueType other ) const;
        */

        /// [1] 解析json对象
        QString encoding =  QString::fromStdString(value["encoding"].asString());

        // 在转换前,可以先判断下对象的数据类型然后再做对应转换,避免出现错误
        int indent_length = value["indent"]["length"].isInt() ?  value["indent"]["length"].asInt() : 0;
        bool indent_use_sapce = value["indent"]["use_space"].asBool();


        /// [2] 解析json数组
        const Json::Value arrayObj_plug = value["plug-ins"];
        qDebug() << "plu-ins :[";
        for(unsigned int i = 0;i < arrayObj_plug.size(); ++i)
        {
            qDebug ()  << "\t"<< QString::fromStdString(arrayObj_plug[i].asString()) << ",";
        }
        qDebug() << "],";

        const Json::Value arrayObj_types = value["types"];
        qDebug() << "type: [" ;
        for(unsigned int i = 0;i < arrayObj_types.size(); ++i)
        {
            qDebug() << "{" ;
            qDebug () << "\t" << "A:" << arrayObj_types[i]["A"].asInt();
            qDebug () <<  "\t" << "B:" << arrayObj_types[i]["B"].asInt();
            qDebug() << "},";
        }
        qDebug() << "],";


        qDebug() << "encoding :" << encoding;
        qDebug() << "indent_length :" << indent_length;
        qDebug() << "indent_use_sapce :" << indent_use_sapce;
    }

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "*************************************";
    QString string = generate_json_string();
    qDebug() << generate_json_string();
    qDebug() << "*************************************";
    parsing_json_string(string);



    return a.exec();
}

打印输出结果如下:

*************************************
"{
   "encoding" : "UTF-8",
   "indent" : {
      "length" : 3,
      "use_space" : true
   },
   "plug-ins" : [ "python", "c++", "ruby" ],
   "types" : [
      {
         "A" : 1,
         "B" : 5
      },
      {
         "A" : 2,
         "B" : 6
      }
   ]
}
"
*************************************
plu-ins :[
         "python" ,
         "c++" ,
         "ruby" ,
],
type: [
{
         A: 1
         B: 5
},
{
         A: 2
         B: 6
},
],
encoding : "UTF-8"
indent_length : 3
indent_use_sapce : true

从输出结果来看,jsoncpp也可以灵活的生成和解析jsoncpp字符串,比QJson似乎更加容易上手一些呢。

那么,我们来简单对比下jsoncpp和QJson。

(1)格式上,jsoncpp相对于QJson生成的Json字符串来说,就是多了很多空格和换行符号,优点是 打印输出的json格式十分直观,缺点就是字符串长度变大,占用更多的存储空间,如果在网络传输中直接使用,会浪费较多的流量。所以如果使用Jsoncpp,我们实际项目中会对字符串进行优化,除空格和换行,甚至会使用字符串压缩技术,这部分我们在后面的文章中讲。

(2)QJson依赖于Qt组件,在Qt项目中使用还是很好的,但这也是他存在的局限性。在非Qt项目中,当然建议使用jsoncpp

 

附: 如何在嵌入式设备中使用 jsponcpp?

1、库文件编译如下,使用方法参照如上测试案例。

1、安装 scons
$ sudo apt-get install scons
$ scons platform=linux-gcc

2、编译jsconcpp库文件

mkdir arm_jsoncpp 
cp -r include/json arm_jsoncpp/ 
cp src/lib_json/* arm_jsoncpp/
cd arm_jsoncpp/

#create static dll
#arm-arago-linux-gnueabi-g++ -c *.cpp  -fPIC
#ar cr libjsoncpp.a *.o

#create dynamicall dll
arm-arago-linux-gnueabi-g++ -shared -fPIC *.cpp -o libjsoncpp.so


注意:在编译过程中如果出现以下的错误:
json_reader.cpp:1:25: fatal error: json/reader.h: No such file or directory
compilation terminated.
json_value.cpp:2:24: fatal error: json/value.h: No such file or directory
compilation terminated.
json_writer.cpp:1:25: fatal error: json/writer.h: No such file or directory
compilation terminated.

【解决方法:】头文件的路径不对。将<json/reader.h> 修改成"json/reader.h";其他几个文件也对应处理。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Jsoncpp生成和解析Json字符串 的相关文章

  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • JsonCpp - 当有 json::Value 对象时,我如何知道它的键名称?

    假设我有这个 Json 文件 id 0 使用 jsoncpp 我可以有一个Json Value通过这样做来对象 Json Value node root 0u id 好的 在代码的其他地方 我明白了node对象 我想从中获取一些信息 我可以
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码

随机推荐

  • 复杂综合类型问题的定位思路

    文章目录 复杂综合类型问题的定位思路 定位思路 常见定位工具 文本操作 文件操作 网络和进程 其它常用 复杂综合类型问题的定位思路 定位思路 常见定位工具 文本操作 文本查找 grep 文本分析 awk 文本处理 sed 文件操作 文件监听
  • python 求最大内切圆和最小外接圆问题

    记录 一 求最大内切圆 图片应该是要一张二值图像 这个有程序可以将其变成 cv2 用cv2来的findcontours 函数先找到图像中每一个连通域的轮廓 然后遍历轮廓 计算每一点到轮廓的距离 pointpolygontest 函数 再用m
  • 2020年秋招嵌入式软件面试过程总结(华为联发科小米兆易创新)

    秋招投递公司23家 简历被刷1家 笔试 测评挂掉3家 至今无消息的8家 获得Offer的公司有小米 兆易创新 全志科技 浙江大华 海格通信 京信通信 景嘉微电子 广州朗国电子 北京华大电子 中国长城科技集团 文章目录 有面试 联发科北京 7
  • shiro框架---通过系统介绍shiro框架中的实现逻辑

    接上一篇文章关于shiro框架的简单介绍及用户表的建立维护 项目已分享到GitHub上 如果需要的可以看下 springboot shiro项目Git下载地址 本篇主要通过一个已经实现用户登录和权限验证的系统 结合sql 展示一下我的实现
  • 听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider

    前言 NET平台的开发一直都只能使用Visual Studio来开发 自从dotnet core 发布后不久 jetbrains 发布了Rider预览版 到目前为止的正式版2017 3 1 博主都使用过 因为博主的主力开发语言是C 所以一直
  • 你不知道的JavaScript-----词法作用域

    作用域 引擎就是老大 是终极控制中心 控制整个程序的执行 编译器是协助引擎解析程序 而作用域是解析程序的一种规则 注意 无论函数在哪里调用 也无论它如何被调用 它的词法作用域都只由函数被声明时所处的位置决定 词法阶段 词法作用域就是定义在词
  • 基于vue的文件夹上传插件

    基于vue simple uploader封装文件分片上传 秒传及断点续传的全局上传插件 1 前言 之前公司要在管理系统中做一个全局上传插件 即切换各个页面的时候 上传界面还在并且上传不会受到影响 这在vue这种spa框架面前并不是什么难题
  • statsmodels API

    1 介绍 主要的 statsmodels API 分为以下模块 statsmodels api 横截面模型和方法 statsmodels tsa api 时间序列模型和方法 statsmodels formula api 使用公式字符串和
  • 《数学建模与数学实验》第5版 非线性规划 习题4.4

    文章目录 1 一电路由三个电阻 R 1 R 2
  • JAVA框架03 -- Spring

    概念相关 spring 是什么 Spring 是分层的 Java SE EE 应用 full stack 轻量级开源框架 以 IoC Inverse Of Control 反转控制 和 AOP Aspect Oriented Program
  • JavaWeb核心技术——Web概述

    目录 1 Web概述 1 1 Web和JavaWeb的概念 1 2 JavaWeb技术栈 1 2 1 B S架构 1 2 2 静态资源 1 2 3 动态资源 1 2 4 数据库 1 2 5 HTTP协议 1 2 6 Web服务器 1 Web
  • 【华为OD】

    目录 一 题目描述 二 输入描述 三 输出描述 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 给定两个字符串 s1 和 s2 和正整数 K 其中 s1 长度为 n1 s2 长度为 n2 在 s2 中选一个
  • 跳频技术——学习总结(一)

    跳频技术 学习总结 一 开始跳频的学习快一个月了吧 最近才停下其它事情 集中时间看了一些内容 资料有 跳频通信干扰与抗干扰技术 那丹彤 跳频通信 梅文华 和网上百度的各种资料 一 扩频概念和分类 扩频通信 一种利用与信息无关的伪随机序列使射
  • Linux之GPIO应用

    目录 一 sysfs 文件系统 二 LED标准接口 三 GPIO标准接口 1 gpiochipX 2 export direction value active low edge 3 unexport 在 Linux 系统下 一切皆文件 应
  • 外包的水太深了,18k的阿里外包不太敢去.....

    有挺多测试员曾在BAT 网易这些大厂做过外包 想必大家也是非常关心此类问题 我就想介绍下 什么是外包 外包公司的现状 就 为什么这么多人鄙视外包测试岗 阿里18K的外包测试岗能去吗 谈谈自己的想法 什么是外包 外包指企业在管理系统实施过程中
  • Environment Modules

    什么是 Environment Modules 通常 用户在登录时通过为会话期间要引用的每个应用程序设置环境信息来初始化其环境 Environment Modules包 是一个简化shell初始化的工具 它允许用户在使用 modulefil
  • JSTL的基本使用

    开发工具与关键技术 IDEA 撰写时间 2022 8 28 前提 创建一个java Maven项目 并把 Tomcat 装上 并在后端传数据到jsp页面 在 pox xml文件下导入该jar包
  • WEB_HCTF_2018_WarmUp

    Categories web 代码审计 write up source code get source code http eb22847d 9f8a 4ecf b972 5ecebfcf5faf node3 buuoj cn source
  • C++ sizeof() 和一道面试题

    首先要明确sizeof不是函数 也不是一元运算符 他是个类似宏定义的特殊关键字 sizeof 括号内在编译过程中是不被编译的 而是被替代类型 如int a 8 sizeof a 在编译过程中 它不管a的值是什么 只是被替换成类型sizeof
  • 使用Jsoncpp生成和解析Json字符串

    上一篇 同大家一起分享了QJson的移植 Qt4 8 3 使用技巧 如何移植和使用QJson 本篇我们来熟悉下使用Jsoncpp生成和解析Json字符串 当然作为Qt的狂热爱好者 我还是会继续改造Jsoncpp项目 来一个Qt项目版 需要下