前段时间用到C++来封装com 因此从数据转换上我采用的Json来当两种语言的传递方式,现做下json的序列化与反序列化方案的总结:

Rapidjson

文档地址:http://rapidjson.org/zh-cn/

使用体会:比C# 现有的各类Json库相比调用麻烦需要特别清楚整体结构。

序列化代码:

                rapidjson::Document jsonDoc;
rapidjson::Document::AllocatorType &allocator = jsonDoc.GetAllocator(); //获取分配器 jsonDoc.SetArray(); for(int i=0;i< facesPoint.size();i++)
{
Value faceArray(kObjectType);
Value jawArray(kArrayType);
for(int j=0;j<facesPoint[i].jaw.size();j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].jaw[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].jaw[j].Y, allocator);
jawArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("jaw", jawArray, allocator); Value leftBroArray(kArrayType);
for (int j = 0; j<facesPoint[i].leftBrow.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].leftBrow[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].leftBrow[j].Y, allocator);
leftBroArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("leftBrow", leftBroArray, allocator); Value leftEyeArray(kArrayType);
for (int j = 0; j<facesPoint[i].leftEye.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].leftEye[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].leftEye[j].Y, allocator);
leftEyeArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("leftEye", leftEyeArray, allocator); Value mouthArray(kArrayType);
for (int j = 0; j<facesPoint[i].mouth.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].mouth[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].mouth[j].Y, allocator);
mouthArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("mouth", mouthArray, allocator); Value mouth2Array(kArrayType);
for (int j = 0; j<facesPoint[i].mouth2.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].mouth2[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].mouth2[j].Y, allocator);
mouth2Array.PushBack(pointobj, allocator);
}
faceArray.AddMember("mouth2", mouth2Array, allocator); Value noseArray(kArrayType);
for (int j = 0; j<facesPoint[i].nose.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].nose[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].nose[j].Y, allocator);
noseArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("nose", noseArray, allocator); Value rightBrowArray(kArrayType);
for (int j = 0; j<facesPoint[i].rightBrow.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].rightBrow[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].rightBrow[j].Y, allocator);
rightBrowArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("rightBrow", rightBrowArray, allocator); Value rightEyeArray(kArrayType);
for (int j = 0; j<facesPoint[i].rightEye.size(); j++)
{
Value pointobj(kObjectType);
pointobj.AddMember("x", facesPoint[i].rightEye[j].X, allocator);
pointobj.AddMember("y", facesPoint[i].rightEye[j].Y, allocator);
rightEyeArray.PushBack(pointobj, allocator);
}
faceArray.AddMember("rightEye", rightEyeArray, allocator); jsonDoc.PushBack(faceArray, allocator);
} rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
jsonDoc.Accept(writer);

 JSON for Modern C++

文档地址:https://github.com/nlohmann/json

使用体会:目前为止找到比较简单粗暴的json解决方案代码也简单易懂

序列化前必要的模版声明

namespace NaughtyKidFaceRectangle
{
struct FaceRectangle
{
public:
double top;
double bottom;
double left;
double right;
double width;
double height;
FaceRectangle() {};
FaceRectangle(double _top, double _bottom, double _left, double _right, double _width, double _height)
{
top = _top;
bottom = _bottom;
left = _left;
right = _right;
width = _width;
height = _height;
} }; inline void to_json(nlohmann::json& j, const FaceRectangle& p)
{
j = nlohmann::json
{
{"top", p.top},
{ "bottom", p.bottom} ,
{ "left", p.left },
{ "right", p.right },
{ "width", p.width },
{ "height", p.height }
};
} inline void from_json(const nlohmann::json& j, FaceRectangle& p)
{
p.top = j.at("top").get<double>();
p.bottom = j.at("bottom").get<double>();
p.left = j.at("left").get<double>();
p.right = j.at("right").get<double>();
p.width = j.at("width").get<double>();
p.height = j.at("height").get<double>(); }
} namespace NaughtyKid
{
struct NaughtyKidPoint
{ public:
NaughtyKidPoint() {};
NaughtyKidPoint(double _x, double _y) { x = _x; y = _y; }
NaughtyKidPoint(double _x, double _y, int _index) { x = _x; y = _y; index = _index; } double x;
double y;
int index; }; void to_json(nlohmann::json& j, const NaughtyKidPoint& p) {
j = nlohmann::json{
{
"x", p.x
},{ "y", p.y } ,{"index",p.index}};
} void from_json(const nlohmann::json& j, NaughtyKidPoint& p) {
p.x = j.at("x").get<double>();
p.y = j.at("y").get<double>();
p.index = j.at("index").get<double>();
}
} using namespace NaughtyKid;
namespace dlib_face
{
struct dlib_face
{
public:
std::vector<NaughtyKidPoint> jaw; //下巴
std::vector<NaughtyKidPoint> rightBrow; //右眉毛
std::vector<NaughtyKidPoint> leftBrow; //左眉毛
std::vector<NaughtyKidPoint> nose; //鼻子
std::vector<NaughtyKidPoint> rightEye; //右眼
std::vector<NaughtyKidPoint> leftEye; //左眼
std::vector<NaughtyKidPoint> mouth; //上嘴唇
std::vector<NaughtyKidPoint> mouth2; //下嘴唇 double face_width;
double face_height; }; struct dlib_facedetails
{
public:
dlib_face featurepoint;
double angleofface;
}; inline void to_json(nlohmann::json& j, const dlib_facedetails& p)
{
j = nlohmann::json
{
{"featurepoint",p.featurepoint},
{"angleofface",p.angleofface}
};
} inline void from_json(const nlohmann::json& j, dlib_facedetails& p)
{
p.featurepoint = j.at("featurepoint").get<dlib_face>();
p.angleofface = j.at("angleofface").get<double>();
} inline void to_json(nlohmann::json& j, const dlib_face& p) {
j = nlohmann::json{
{ "jaw", p.jaw },
{ "rightBrow", p.rightBrow },
{ "leftBrow", p.leftBrow },
{ "nose",p.nose },
{ "rightEye",p.rightEye },
{ "leftEye",p.leftEye },
{ "mouth",p.mouth },
{ "mouth2",p.mouth2 },
{"face_width",p.face_width},
{"face_height",p.face_height} };
} inline void from_json(const nlohmann::json& j, dlib_face& p) {
p.jaw = j.at("jaw").get<std::vector<NaughtyKidPoint>>();
p.rightBrow = j.at("rightBrow").get<std::vector<NaughtyKidPoint>>();
p.leftBrow = j.at("leftBrow").get<std::vector<NaughtyKidPoint>>();
p.nose = j.at("nose").get<std::vector<NaughtyKidPoint>>();
p.rightEye = j.at("rightEye").get<std::vector<NaughtyKidPoint>>();
p.leftEye = j.at("leftEye").get<std::vector<NaughtyKidPoint>>();
p.mouth = j.at("mouth").get<std::vector<NaughtyKidPoint>>();
p.mouth2 = j.at("mouth2").get<std::vector<NaughtyKidPoint>>();
p.face_width = j.at("face_width").get<double>();
p.face_height = j.at("face_height").get<double>();
}
}

序列化部分代码:

        std::vector<NaughtyKidFaceRectangle::FaceRectangle> faces;

	nlohmann::json j = faces;

	std::ostringstream oss;

	oss << j << endl;

反序列化代码:

const auto js = nlohmann::json::parse(sp.c_str());

const dlib_face::dlib_face ddlibfaces = js;

C++ json解决方案的更多相关文章

  1. 报错需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config.json解决方案

    前言 小程序的第一个坑就是,创建了一个小程序项目,却在微信web开发者工具无法打开... 报了个错:需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config. ...

  2. iOS学习—JSON数据解析

      关于在iOS平台上进行JSON解析,已经有很多第三方的开源项目,比如TouchJson,JSONKit,SBJon等,自从iOS5.0以后,苹果SDK推出了自带的JSON解决方案NSJSONSer ...

  3. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  4. Swift - 解析JSON数据(内置NSJSONSerialization与第三方JSONKit)

    一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SDK自带的JSON解决方案NSJSONSerialization,这是一个非常好用的JSON生成和解析工具,效率也比其 ...

  5. iOS学习——JSON数据解析(十一)

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  6. json解包与json封包

    首先,对两个名词进行简单的说明: 1.NSData 用来存储二进制的数据类型.NSData类提供了一种简单的方式,它用来设置缓冲区.将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件.不变缓冲区(N ...

  7. Akka(33): Http:Marshalling,to Json

    Akka-http是一项系统集成工具.这主要依赖系统之间的数据交换功能.因为程序内数据表达形式与网上传输的数据格式是不相同的,所以需要对程序高级结构化的数据进行转换(marshalling or se ...

  8. iOS学习笔记(十一)——JSON数据解析

    在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...

  9. [译]Flutter JSON和序列化

    [译]Flutter JSON和序列化   很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...

随机推荐

  1. 吴裕雄--天生自然python学习笔记:Python3 错误和异常

    语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 >>>while True print('Hello world') File "< ...

  2. input系统——android input系统

    AndroidInput系统--JNI NativeInputManager InputManger InputReader AndroidInput系统--InputReader AndroidIn ...

  3. 吴裕雄--天生自然 R语言开发学习:方差分析

    #-------------------------------------------------------------------# # R in Action (2nd ed): Chapte ...

  4. 基于物理的渲染——间接光照

    在前面的文章中我们已经给出了基于物理的渲染方程: 并介绍了直接光照的实现.然而在自然界中,一个物体不会单独存在,光源会照射到其他的物体上,反射的光会有一部分反射到物体上.为了模拟这种环境光照的形式,我 ...

  5. Redis从出门到高可用--Redis复制原理与优化

    Redis从出门到高可用–Redis复制原理与优化 单机有什么问题? 1.单机故障; 2.单机容量有瓶颈 3.单机有QPS瓶颈 主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/s ...

  6. 利用Nginx或koa

    最近在做上传的图片的需求,思考上传之后的图片怎么访问的问题,因为后端是Node,一开始尝试写一个专门的接口通过传入图片的path来查找,试了一下感觉并不理想,因为要为每种类型的文件设置Content- ...

  7. Selenium&Pytesseract模拟登录+验证码识别

    验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...

  8. MyBatis 判断条件为等于的时候,常量需要加 .toString()

    当MyBatis 判断条件为等于的时候,常量需要加 .toString() 来转换,这种方法是稳定的,推荐使用,比如: <!-- 正确的,稳定,推荐使用 --> <if test=& ...

  9. Ta说:2016微软亚洲研究院第二届博士生论坛

    ​ "聚合多元人才创造无尽可能,让每一位优秀博士生得到发声成长机会"可以说是这次微软亚洲研究院博士生论坛最好的归纳了.自去年首次举办以来,这项旨在助力青年研究者成长的项目迅速得到了 ...

  10. TypeScript声明文件

    为什么需要声明? 声明的本质是告知编译器一个标识符的类型信息.同时,在使用第三方库时,我们需要引用它的声明文件,才能获得对应的代码补全.接口提示等功能. 声明在TypeScript中至关重要,只有通过 ...