C++ json解决方案
前段时间用到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解决方案的更多相关文章
- 报错需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config.json解决方案
前言 小程序的第一个坑就是,创建了一个小程序项目,却在微信web开发者工具无法打开... 报了个错:需要选择一个空目录,或者选择的非空目录下存在 app.json 或者 project.config. ...
- iOS学习—JSON数据解析
关于在iOS平台上进行JSON解析,已经有很多第三方的开源项目,比如TouchJson,JSONKit,SBJon等,自从iOS5.0以后,苹果SDK推出了自带的JSON解决方案NSJSONSer ...
- iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...
- Swift - 解析JSON数据(内置NSJSONSerialization与第三方JSONKit)
一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SDK自带的JSON解决方案NSJSONSerialization,这是一个非常好用的JSON生成和解析工具,效率也比其 ...
- iOS学习——JSON数据解析(十一)
在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...
- json解包与json封包
首先,对两个名词进行简单的说明: 1.NSData 用来存储二进制的数据类型.NSData类提供了一种简单的方式,它用来设置缓冲区.将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件.不变缓冲区(N ...
- Akka(33): Http:Marshalling,to Json
Akka-http是一项系统集成工具.这主要依赖系统之间的数据交换功能.因为程序内数据表达形式与网上传输的数据格式是不相同的,所以需要对程序高级结构化的数据进行转换(marshalling or se ...
- iOS学习笔记(十一)——JSON数据解析
在之前的<iOS学习——xml数据解析(九)>介绍了xml数据解析,这一篇简单介绍一下Json数据解析.JSON 即 JavaScript Object Natation,它是一种轻量级的 ...
- [译]Flutter JSON和序列化
[译]Flutter JSON和序列化 很难想象一个移动应用程序不需要与Web服务器通信或在某些时候容易存储结构化数据.制作网络连接的应用程序时,迟早需要消耗一些好的旧JSON. 本指南介绍了如何 ...
随机推荐
- 别恐慌,大众关心的人工智能问题学界都在努力求解——我眼中的AAAI 2015大会
2015大会" title="别恐慌,大众关心的人工智能问题学界都在努力求解--我眼中的AAAI 2015大会"> 作者:微软亚洲研究院副研究员 黄铂钧 今年是美国 ...
- Jquery和js实现cookie操作手机浮层广告;附加:js获取、添加、删除cookie
1.jquery cookie包实现手机上的浮层广告 <span style="font-size:18px;">$(document).ready(function( ...
- 在C代码调用C++代码
由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情. C++代码调用C代码很简单,只要分别在包 ...
- Spring Security基本原理
近期研究了Spring Security,现进行记录. 首先先进行一个最简单的demo.默认情况下,在Spring Boot里,如果在classpath下面有Spring Security相关的jar ...
- 支持向量机 SVM - Wenjing
概念 将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面.在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化.假定平行超平面间的距离或差距越大, ...
- numpy的基础计算2
import numpy as np A = np.arange(14,2,-1).reshape((3,4)) #平均值 print(np.mean(A)) print(A.mean()) prin ...
- 【NOIP14 D2T2】寻找道路
Source and Judge NOIP2014 提高组 D2T2Luogu2296Caioj1567 Problem [Description] 在有向图 G 中,每条边的长度均为 1,现给定起点 ...
- [Python_scrapy图片爬取下载]
welcome to myblog Dome地址 爬取某个车站的图片 item.py 中 1.申明item 的fields class PhotoItem(scrapy.Item): # define ...
- nginx 502排错
线上一台机器(该论坛所在机器)近期频繁出现502,每100次访问就会出现10次,这频率也太高了.于是开始了我的502排查之旅 ps aux |grep -c php 结果为200 netstat -a ...
- Python——11面向对象编程基础
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...