一个c++版本的json实现思路

C++ 轻量级对象JSON序列化实现 背景: 在项目里经常遇到对象和json字符串的相互转换这类问题,在大多数程序里,一般这个问题都比较有比较好的解决方法,往往一个函数搞定。但是到了c++这边却需要我们手撸json库一个一个字段初始化/序列化。如果这时候有一个函数 可以一行代码 unmarshal /marshal 对象岂不是很方便?本文以jsoncpp库为基础,设计这样一个可以支持这种功能的函数,下面进入正题~ 设计思路 以unmarshal 为例,我们最终的函数是打造两个这样的模板函数 : 一个从string 的josn直接反序列化对象,一 阅读详情

JSON的c/c++实现版本很多,可是用起来总是感觉不是那么顺手,于是就把自己能用的所谓奇技淫巧全都使了出来,可是貌似还是不尽满意。不过还是贴出来,算是当个纪念吧。

#include <unordered_map>
#include <algorithm>
#include <sstream>
#include <vector>
#include <map>
typedef std::unordered_map<std::string,std::string> object_container;

namespace value_object_detail{	
	static const std::string string_type = "string";
	static const std::string number_type = "number";
	static const std::string bool_type = "bool";
	static const std::string object_type = "object";
	static const std::string array_type = "array";
	static const std::string null_type = "null";

JSON数值实现类,用来尽可能的使得字符串数值和c/c++原生数据类型无缝集成

	class json_value{
	public:
		json_value(object_container& inst,const std::string& key):
			inst_(inst),preffix_(key)
		{
		}
		json_value(const json_value& jv):inst_(jv.inst_),preffix_(jv.preffix_){
		}
	protected:
		void set_meta_information(const std::string& key,int index = 0){
			std::string& key_type = inst_[preffix_];
			const char* assert_type = NULL;
			std::stringstream ss;
			if(!key.empty()){
				ss << "object@" << key << ",";
				assert_type = "array@";
			}else{
				ss << "array@" << index << ",";
				assert_type = "object@";
			}
			std::string append_type =  ss.str();
			if(std::string::npos != key_type.find(assert_type)){
				del();
				inst_[preffix_] = append_type;
				return;
			}				
			//assign repeat
			if(std::string::npos == key_type.find(append_type)){
				key_type += append_type;
			}			
		}
	public:
		json_value operator[](int i){
			using namespace value_object_detail;
			set_meta_information("",i);
			std::stringstream ss;					
			ss << preffix_ << "." << i;
			return json_value(inst_,ss.str());
		}
		json_value operator[](const std::string& key){
			using namespace value_object_detail;			
			set_meta_information(key);
			return json_value(inst_,key.empty() ? preffix_ : preffix_ + "." + key);
		}
	public:
		std::string& operator*(){
			return inst_[preffix_];
		}
		bool operator!()const{
			return inst_.end() == inst_.find(preffix_);
		}
	public:
		const std::string& str_value()const {
			const static std::string ret;
			object_container::const_iterator it = inst_.find(preffix_);
			return inst_.end() == it ? ret : it->second;
		}
		const std::string& str_key()const {
			return preffix_;
		}
	public:
		const std::string& type_string()const{
			const std::string& val = str_value();
			if(val.empty()){
				return null_type;
			}
			if(std::string::npos != val.find("array@")){
				return array_type;
			}
			if(std::string::npos != val.find("object@")){
				return object_type;
			}
			return number_type;
		}
	public:
		template<class Fn>
		void for_each(Fn f){
			object_container::const_iterator it = inst_.find(preffix_);
			const std::string& type = type_string();
			if(inst_.end() == it || (array_type != type && object_type != type)){
				return ;
			}
			std::string sub_key = "";
			std::string::size_type posb = 0,pose = 0,posn = std::string::npos;
			object_container::const_iterator sub_it;
			for(posb = pose = 0;;posb += 1,pose += 1){
				posb = it->second.find('@',posb);
				pose = it->second.find(',',pose);
				if(posn == posb || posn == pose){
					break;
				}
				sub_key = it->second.substr(posb+1,pose - posb -1);
				sub_it = inst_.find(preffix_ + "." + sub_key);
				if(inst_.end() != sub_it){
					f(sub_key,sub_it->second);
				}else{
					f(sub_key,"");
				}
			}
		}
		void del(){
			const std::string& type = type_string();
			if(array_type == type){
				int i = 0;
				for(json_value jv = this->operator[](i);!!jv;++i){
					jv.del();
				}
			}else if(object_type == type){
				for_each([this](const std::string& key,const std::string& v){
					json_value sub_item = this->operator[](key);
					sub_item.del();
				});
			}
			inst_.erase(preffix_);
		}	
	public:
		template<class T>
		json_value& operator=(const T& val){
			*this << val;
			return *this;
		}
		json_value& operator=(const std::string& val){
			inst_[preffix_] = val;
			return *this;
		}
		json_value& operator=(const json_value& jv){
			inst_ = jv.inst_;
			preffix_ = jv.preffix_;
			return *this;
		}
	private:
		object_container& inst_;
		std::string preffix_;
	};

各种赋值包装

	template<class T>
	json_value& operator <<(json_value& jv,const T& val){
		std::stringstream ss;
		ss << val;
		*jv = ss.str();
		return jv;
	}
	template<class T>
	json_value& operator <<(json_value& jv,const bool& val){
		*jv = val ? "true" : "false";
		return jv;
	}
	template <class T> 
	json_value& operator<<(json_value& jv,const std::vector<T>& val){
		int i = 0;
		std::for_each(val.begin(),val.end(),[&i,&jv](const T& v){
			jv[i++] = v;
		});		
		return jv;
	}
	template <class T, int N> 
	json_value& operator<<(json_value& jv,const T (&val)[N]){
		int i = 0;
		std::for_each(&val[0],&val[N],[&i,&jv](const T& v){
			jv[i++] = v;
		});		
		return jv;
	}
	template<class T>
	json_value& operator>>(json_value& jv,T& val){
		std::stringstream ss;
		ss << *jv;
		ss >> val;
		return jv;
	}
	template<>
	json_value& operator>>(json_value& jv,bool& val){
		val = ("true" == *jv);
		return jv;
	}

	template<>
	json_value&  operator>>(json_value& jv,std::string& val){
		val = *jv;
		return jv;
	}
	template <class T> 
	json_value&  operator>>(json_value& jv,std::vector<T>& val){
		int i = 0;
		jv.for_each([&val,&jv,&i](const std::string& k,const std::string&v){
			T t;
			jv[i++] >> t;
			val.push_back(t);
		});
		return jv;
	}
	template <class T, int N> 
	json_value& operator>>(json_value& jv,T (&val)[N]){
		int i = 0;
		jv.for_each([&val,&jv,&i](const std::string& k,const std::string&v){
			jv[i] >> val[i];
			++i;
		});
		return jv;
	}

一个简单的JSON解析器,没有语法检测,而且效率还不敢恭维,实在有重构的必要

	class json_parser{
	public:
		json_parser(json_value& value):values_(value){
		}
	protected:
		json_value values_;
		std::list<std::string> items_;
	public:
		bool operator()(const std::string& json_str){
			state_ op(items_);
			std::for_each(json_str.begin(),json_str.end(),op);
			parse_items();
			return items_.empty();
		}
		bool operator()(std::istream& is){
			state_ op(items_);
			std::for_each(std::istream_iterator<char>(is),std::istream_iterator<char>(),op);
			parse_items();
			return items_.empty();
		}
	protected:
		void parse_items(){
			if("{" != items_.front() && "[" != items_.front()){
				items_.push_front("{");
				items_.push_back("}");
			}
			parse_object(values_);
		}
	protected:
		class state_{
		private:
			bool in_close_;
			std::string item_;
			std::list<std::string>& items_;
		protected:
			bool in_string(const char& c){
				if(!in_close_){
					return false;
				}
				if('"' == c && '\\' != item_.back()){
					in_close_ = false;
					return false;
				}
				if(item_.empty() || '\\' != item_.back()){
					item_.push_back(c);
					return true;
				}
				switch(c){
				case '"': item_.back() = '"'; break;
				case 't': item_.back() = '\t'; break;
				case 'n': item_.back() = '\n'; break;
				case 'r': item_.back() = '\r'; break;
				case '\\': item_.back() = '\\'; break;
				default: item_.push_back(c);break;
				}
				return true;
			}
		public:
			state_(std::list<std::string>& items):in_close_(false),items_(items){}
		public:
			void operator()(const char& c){
				if(in_string(c)){
					return;
				}
				switch (c)
				{
				case '"': {
					if(!in_close_ && !item_.empty()){
						items_.push_back(item_);
						item_.clear();
						break;
					}
					in_close_ = item_.empty();
					break;
						  }
				case '{':	case '}':	case '[':	case ']':{
					item_.push_back(c);
					items_.push_back(item_);
					item_.clear();
					break;
							}
				case ':':	case ',':{
					item_.empty() ? (void) 0 : items_.push_back(item_);
					item_.clear();
					break;
							}
				case ' ':	case '\t':	case '\n':	case '\r':{
					break;
							}
				default:{
					item_.push_back(c);
					break;
						}
				}
			}
		};		
	protected:
		void parse_object(json_value& jv){
			if("{" != items_.front()){
				return;
			}
			for(items_.pop_front();"}" != items_.front();){
				parse_item(jv);
			}
			items_.pop_front();
		}
		void set_item_value(json_value& jv){
			std::string  val = items_.front();
			if(val == "["){
				parse_array(jv);
				return;
			}
			if(val == "{"){
				parse_object(jv);
				return;
			}
			*jv = val;
			items_.pop_front();
		}
		void parse_array(json_value& jv){
			if("[" != items_.front()){
				return;
			}
			int i = 0;
			for(items_.pop_front();"]" != items_.front(); ++i){
				set_item_value(jv[i]);
			}
			items_.pop_front();
		}
		void parse_item(json_value& jv){
			std::string  key = items_.front();
			items_.pop_front();
			set_item_value(jv[key]);
		}
	};

一个JSON字符串生成器,同样不是很严格

	class json_maker {
	public:
		json_maker(std::ostream& os,json_value& jv):os_(os),json_vlaue_(jv){
		}
	protected:
		std::ostream& os_;
		json_value& json_vlaue_;
	public:
		void operator()(){
			os_ << "{";
			json_vlaue_.for_each([this](const std::string& k,const std::string& v){
				this->to_string(this->json_vlaue_[k]);
				this->os_ << ",";
			});
#define set_last_op(c) do{\
	std::ostream::off_type pos = os_.tellp();\
	os_.seekp(pos -1);\
	os_.write(c,1);\
			}while(0)
			set_last_op("}");
		}
	protected:
		void to_string(json_value& item,bool array_item = false){
			const std::string& type = item.type_string();
			if(!array_item){
				const std::string& preffix_ = item.str_key();
				std::string::size_type pos = preffix_.find_last_of('.');
				std::string key = (std::string::npos == pos) ? preffix_ : preffix_.substr(pos + 1);
				os_ << "\"" << key << "\":";
			}
			if(array_type == type){
				os_ << "[";
				int i = 0;
				for(json_value jv = item[i];!!jv; jv = item[++i]){
					to_string(jv,true);
					os_ << ",";
				}
				set_last_op("]");
			}else if(object_type == type){
				os_ << "{";
				item.for_each([this,&item](const std::string& k,const std::string& v){
					to_string(item[k]);
					this->os_ << ",";
				});
				set_last_op("}");
			}else{
				formart_value(item.str_value());
			}
		}
#undef set_last_op
	protected:
		bool isnumber(const std::string& str)const{
			for(const char* cstr = str.c_str();*cstr;++cstr){
				switch (*cstr)
				{
				case '+':		case '-':		case '.':
				case '0':		case '1':		case '2':
				case '3':		case '4':		case '5':
				case '6':		case '7':		case '8':
				case '9':		case 'e':		case 'E':
					{
						break;
					}
				default:
					return false;
					break;
				}
			}
			return true;
		}
	protected:
		void formart_value(const std::string& val){
			if(val.empty()){
				os_ << "\"\"";
				return;
			}
			if("true" == val || "false" == val || isnumber(val)){
				os_ << val;
				return ;
			}
			os_ << "\"";
			std::for_each(val.begin(),val.end(),[this](const char& c){
				switch (c)
				{
				case '"':  this->os_ << "\\\""; break;
				case '\t': this->os_ << "\\t";  break;
				case '\n': this->os_ << "\\n";  break;
				case '\r': this->os_ << "\\r";  break;
				case '\\': this->os_ << "\\\\"; break;
				default:{
					this->os_ << c;
					break;
						}
				}
			});
			os_ << "\"";
		}
	};
}//end namespace

下面是正JSON使用类的一个包装

class value_object {		
protected:
	object_container values_;
public:
	value_object(){}
	value_object(const std::string& json_str){parse_string(json_str);}
private:
	typedef value_object_detail::json_value json_value;
public:
	template<class T>
	value_object& operator()(const std::string& key,const T& value){
		using namespace value_object_detail;
		json_value(values_,"root." + key) << value;
		return *this;
	}
	template<class T>
	value_object& operator()(const std::string& key,T& value,bool& exist){
		using namespace value_object_detail;
		json_value jv(values_,"root." + key);
		exist = !!jv;
		if(exist) jv >> value ;
		return *this;
	}
public:
	json_value operator[](const std::string& key){
		return json_value(values_,"root")[key];
	}
	json_value operator[](int i){
		return json_value(values_,"root")[i];
	}
public:
	bool operator==(const value_object& vo)const{
		if(this == &vo){
			return true;
		}
		if(vo.values_.size() != values_.size()){
			return false;
		}
		bool result = true;
		std::for_each(vo.values_.begin(),vo.values_.end(),[this,&result](const object_container::const_reference cr){
			if(!result){
				return;
			}
			if(std::string::npos != cr.second.find("object@")){
				return;
			}
			if(std::string::npos != cr.second.find("array@")){
				return;
			}
			object_container::const_iterator it = this->values_.find(cr.first);
			result = (it != this->values_.end()) && (it->second == cr.second);
		});
		return result;
	}
public:
	std::ostream& to_string(std::ostream& os){
		using namespace value_object_detail;
		json_maker(os,json_value(values_,"root"))();
		return os;
	}
	void parse_string(const std::string& json_str){
		using namespace value_object_detail;
		json_parser jp(json_value(values_,"root"));
		jp(json_str);
	}
};

测试程序

#include <iostream>
#include <string>
#include <vector>
struct test_json_obj{
	int ta;
	double tb;
	std::string ts;
public:
	bool operator==(const test_json_obj& r)const{
		return ta == r.ta && int(tb * 1000) == int(r.tb * 1000) && ts == r.ts; 
	}
};

std::ostream& operator<<(std::ostream& os,const test_json_obj& jo){
	os << "{\nta:" << jo.ta << ",\ntb:" << jo.tb << ",\nts:\"" << jo.ts << "\"\n}\n";
	return os;
}
namespace value_object_detail{
	json_value& operator<<(json_value& vc,const test_json_obj& val){
		vc["ta"] = val.ta;
		vc["tb"] = val.tb;
		vc["ts"] = val.ts;
		return vc;
	}
	json_value& operator>>(json_value& vc, test_json_obj& tj){
		vc["ta"] >> tj.ta;
		vc["tb"] >> tj.tb;
		vc["ts"] >> tj.ts;
		return vc;
	}
}

int main(int argn,char* argv[]){
	value_object vo;
	bool exist,null_value;
	{
		test_json_obj obj = {
			1,6.248f,"haha, object"
		},obj1 = {0,0.0f,""},obj2;
		test_json_obj obj_array1[] = {
			obj,obj1
		},obj_array2[3];
		std::vector<test_json_obj> v1,v2;
		v1.push_back(obj);
		v1.push_back(obj1);
		vo["aa"] = 1;
		vo("v1",obj)("array" ,obj_array1)("vector" ,v1);
		vo("v1",obj1,exist)("array",obj_array2,exist)("vector" ,v2,exist)("v2",obj2,null_value);
		assert( exist || !null_value);
		assert(obj1 == obj);
		assert(v2 == v1);
		for(int i = 0; i < 2; ++i){
			assert(obj_array1[i] == obj_array2[i]);
		}
		vo["v1"] = v1;
		v2.clear();
		vo["v1"] >> v2;
		assert(v1 == v2);
		std::for_each(v2.begin(),v2.end(),[](const test_json_obj& v){std::cout << v << ",";});

		vo["obj_array"] = obj_array1;
		vo["obj_array"] >> obj_array2;
		for(int i = 0; i < 2; ++i){
			assert(obj_array1[i] == obj_array2[i]);
		}

		int int_array1[] = { 1,2,3,4,5,6,7},int_array2[10] = {0};
		vo["int_array"] = int_array1;
		vo["int_array"] >> int_array2;
		for(int i = 0; i < 7; ++i){
			assert(int_array1[i] == int_array2[i]);
		}


		vo["int"] = 0;
		vo["double"] = 3.1425f;
		vo["string"] = std::string("hi test");

		int a;double b; std::string s;
		vo("int",a,exist)("double",b,exist)("string",s,exist);
		assert(a == 0 && int(31425) == int(b * 10000) && s == "hi test");
		vo["obj1"] = obj;
		vo["obj1"] >> obj1;
		assert(obj == obj1);
		std::cout << "old_obj = " << obj1 << std::endl;
		vo["obj1.ta"] = 2;
		vo["obj1.tb"] = 3.1415f;
		vo["obj1.ts"] = std::string("hi test");
		vo["obj1"] >> obj;
		assert(obj.ta == 2 && int(obj.tb * 1000) == int(3141) && obj.ts == "hi test");
		std::cout << "new_obj = " << obj;
	}
	{
		const char* json_str = "{"\
			"a:1,"\
			"\"b \" :2,"\
			"c : \"asdf\\\"asdf\","\
			"ab : [1,2,3,4,\"asdfasdf\"],"\
			"ao : [{"\
			"a:1,"\
			"b:2,"\
			"c:\"asdf\""\
			"}]"\
			"}";
		vo.parse_string(json_str);
		int a, b;
		std::string c;
		vo("a",a,exist)("b ",b,exist)("c",c,exist);
		assert(a == 1 && b == 2 && c == "asdf\"asdf");
		vo["ab"][0] >> b;
		vo["ab"][1] >> a;
		vo["ab"][4] >> c;
		assert(a == 2 && b == 1 && c == "asdfasdf");
		vo["ao"][0]["a"] >> a;
		vo["ao"][0]["b"] >> b;
		vo["ao"][0]["c"] >> c;
		assert(a == 1 && b == 2 && c == "asdf");
		std::stringstream ss;
		vo.to_string(ss) << std::endl;
		std::cout << ss.str() << std::endl;
	}
	{
			const char* json_str = "{"\
			"a:1,"\
			"\"b \" :2,"\
			"c : \"asdf\\\"asdf\","\
			"ab : [1,2,3,4,\"asdfasdf\"],"\
			"ao : [{"\
			"a:1,"\
			"b:2,"\
			"c:\"asdf\""\
			"}]"\
			"}";
			value_object vo1;
			std::stringstream ss;
			vo1.parse_string(json_str);
			vo1.to_string(ss);
			value_object vo2;
			vo2.parse_string(ss.str());
			assert(vo1 == vo2);
	}
	return 0;
}

测试结果

{
ta:1,
tb:6.248,
ts:"haha, object"
}
,{
ta:0,
tb:0,
ts:""
}
,old_obj = {
ta:1,
tb:6.248,
ts:"haha, object"
}

new_obj = {
ta:2,
tb:3.1415,
ts:"hi test"
}
{"aa":1,"v1":[{"ta":1,"tb":6.248,"ts":"haha, object"},{"ta":0,"tb":0,"ts":""}],"obj_array":[{"ta":1,"tb":6.248,"ts":"haha, object"},{"ta":0,"tb":0,"ts":
""}],"int_array":[1,2,3,4,5,6,7],"int":0,"double":3.1425,"string":"hi test","obj1":{"ta":2,"tb":3.1415,"ts":"hi test"},"ta":2,"tb":3.1415,"ts":"hi test"
,"a":1,"b ":2,"c":"asdf\"asdf","ab":[1,2,3,4,"asdfasdf"],"ao":[{"a":1,"b":2,"c":"asdf"}]}





json C++开源库:JSON for Modern C++的几个小问题 JSON for Modern C++是nlohmann在GitHub上开源的读写json文件的C++库,使用者仅需包含一个json.hpp文件即可。 开源地址为:GitHub - nlohmann/json: JSON for Modern C++ 使用起来比较简单的了,首先从GitHub上将源码下载到本地,使用CMake编译源码(确保勾选了JSON_BuildTests) 在编译工程中找到unit-readme.cpp、unit-serialization.cpp、unit-deserializa 阅读详情

相关推荐

C++高性能JWT库JWT-CPP实战:从集成到生产环境部署

JSON Web Token(JWT)是一种用于安全传输声明的开放标准,广泛应用于现代Web服务与分布式系统的身份认证与授权。其核心原理是基于JSON格式的令牌,通过数字签名确保信息的完整性和不可篡改性,实现了无状态会话管理。在C++高性能开发领域,集成JWT功能常面临生态库选择少、依赖复杂的挑战。JWT-CPP作为一个header-only库,以其零依赖集成、全面的算法支持和灵活的JSON后端适配能力,为C++项目提供了高效、安全的JWT解决方案。该库支持HMAC、RSA、ECDSA等主流签名算法,并能无

weixin_33889665的博客 435

C++的Json库的简单实现

我的Json库实现Json实现Json[我的源码(点这里)](https://github.com/jo-qzy/MyJson/)和效果图Json库中的类实现JSON::Value类JSON::ReaderJSON::WriterFastWriterStyleWriter序列化部分(Reader)空值、布尔值number字符串转义字符UTF-8转换arrayobject反序列化输出(Writer部...

无聊星期三的博客 1万+

【C++】开源:基于cjson库的json数据处理

cjson库学习

DevFrank的博客 1250

c++实现json解析器

用c++实现的简易版json解析器

qq_65150735的博客 2968

C++中的JSON数据处理与cppjson库应用

本文还有配套的精品资源,点击获取 简介:本简介关注一个专门针对C++语言的JSON处理库——cppjson。JSON作为一种轻量级的数据交换格式,在Web服务和应用程序中广泛使用。cppjson库提供了方便的API来解析、生成和操作JSON数据,支持开发者将JSON字符串转换为C++对象,或将C++对象序列化为JSON格式。学习如何使用cppjson,包括其API的使用、错...

weixin_29025501的博客 1961

qt工程引入opencv库步骤

第一步:新建qt工程 第二步:在工程名.pro文件中添加opencv库的路径                   INCLUDEPATH += /home/liyuanzhe/opencv-2.4.8/include/opencv \ /home/liyuanzhe/opencv-2.4.8/include/opencv2 LIBS += /home/liyuanzhe/open

superyuanzhe的专栏 5722

C++中json的创建和使用「nlohmann/json库」

看完必会 实现将 JSON 数据与 C++ 对象相互转换的功能 ,例如对象、数组、字符串等。本文将针对 nlohmann/json 的集合和字典功能进行讲解,并介绍如何从 JSON 对象中解析特定字段。文末有实体代码 将创建一个足够复杂的json字段用于了解其他普通类型是怎么加入和创建的。

weixin_73062623的博客 1万+

Windows Server 2012评估版过期自动关机问题:两种高效解决方案详解

本文针对Windows Server 2012评估版过期导致的自动关机问题,提供了两种高效解决方案。一是通过slmgr.vbs命令重置授权,临时延长评估期;二是使用DISM工具将评估版转换为正式版,一劳永逸。文章详细解析了两种方法的操作步骤、注意事项及适用场景,帮助用户快速恢复服务器稳定运行。

pytorchlight8的博客 1195

简单讲述c++json解析器的实现

简单分析json解析器的c++实现

weixin_56108590的博客 2340

airodump-ng、aircrack-ng使用教程

wifi破解、airodump-ng、aircrack-ng脚本

ssmbyss的博客 2233

SAP中贸易伙伴的应用原理简析

公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 9815

开源 C++ JSON 库 sonic-cpp解析性能为 rapidjson 的 2.5 倍

sonic-cpp 是由字节跳动 STE 团队和服务框架团队共同研发的一款面向 C++ 语言的高效 JSON 库,极致地利用当前 CPU 硬件特性与向量化编程,大幅提高了序列化反序列化性能,解析性能为 rapidjson 的 2.5 倍。 sonic-cpp 在字节内部上线以来, 已为抖音、今日头条等核心业务,累计节省了数十万 CPU 核心。近日,我们正式对外开源 sonic-cpp,希望能够帮助更多开发者,欢迎大家 star、fork。Github:https://github.com/bytedance

u012181546的博客 3004

深入解析TPS53676 AVSBus接口:协议、帧结构与动态电压调节实战

在数字电源管理领域,动态电压调节(DVS)是实现高性能处理器(如CPU、GPU)节能与性能优化的关键技术。其核心原理在于根据处理器负载实时、精准地调整供电电压,从而在满足性能需求的同时最小化功耗。为实现微秒甚至纳秒级的快速响应,传统的PMBus协议因其协议开销可能成为瓶颈,因此催生了更专注、更低延迟的专用通信接口。AVSBus(自适应电压调节总线)正是PMBus规范中专为点对点、高速电压控制而定义的子集,它继承了PMBus的物理层,但简化了通信流程,其技术价值在于为处理器与电源控制器之间建立了一条高速“专用

weixin_29188043的博客 445

B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器

B编码与BT种子文件分析,以及模仿json-cpp写一个B编码解析器1、什么是B编码2、B编码格式3、种子文件结构3.1、主文件结构3.2、info结构4、简单的例子了解一下种子文件和B编码5、分析JSON-CPP的设计5.1、分析Json::Value::CZString的设计5.2、分析Json::Value的设计5.2.1、类成员设计5.2.2、类方法设计5.3、迭代器的设计5.3.1、Json::ValueIteratorBase5.3.2、Json::ValueConstIterator5.3.3

游戏行业资深搬砖人员 4128

Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

[原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结 by edata @2017-5-1 objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法 因为Win8/Win10对系统盘(默认c:)使用了高级权限管理,所以在此盘下操作文件的修改工作都需要管理员权限才行。 基于这个原因,导致非管理员安

edata的博客 7029

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

【C++ RPC 设计思路】基于 libzmq 的 C++ RPC 实现:请求与应答 JSON 格式的高效设计

在分布式系统中,远程过程调用(RPC)是一种核心技术,允许程序像调用本地函数一样调用远程服务,从而屏蔽了底层网络通信的复杂性。基于 libzmq(ZeroMQ,一个高性能异步消息库)的 C++ RPC 实现因其高效性和灵活性而备受关注。然而,C++ 语言的特性——如强类型、模板机制、可变参数支持以及对二进制数据的直接操作——为 RPC 的设计带来了独特的挑战。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1873

TIM 2024 | AD-YOLO:一种结合 Swin Transformer 和注意力机制的实时 YOLO 网络用于机场场景检测

实时获取机场场景信息对于保障机场安全和提升机场运营效率至关重要。然而,机场场景图像中的人员和车辆目标尺寸较小,而且公开的机场数据不足,这使得机场物体检测成为一项颇具挑战的任务,难以同时实现高精度和实时检测。本文提出了一种全新的机场物体检测方法——机场检测器YOLO(AD - YOLO),它融合了改进的你只看一次(YOLO)算法、Swin Transformer和注意力机制的优势,以应对这一挑战。

小白学视觉 315

vscode一键配置C/C++多个C及CPP文件编译与tasks.json和launch.json原理

vscode配置环境及配置原理 搜了很多的教程,发现要么教程太老,给的配置信息里面有些参数都不能使用了,要么就是直接扔下自己的配置信息就没了,不知道咋来的,也不能拿过来直接用,让我这种小白无从下手,于是就摸索整理一下,帮助一下像我这样小白刚入手的小伙伴们。 原理 我觉得最重要的就是我们要明白各个配置文件是干嘛的,它是怎么被vscode使用的,明白这一点,那么自己就可以比较清晰参数该怎么改,应该改哪些参数,而不是拿着别人的配置文件,无从下手。配置文件基本的原理(只是原理,不是咋配置的): vscode使用的最

taynpg的博客 4万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

现代C++ JSON-RPC实战:基于libjson-rpc-cpp构建轻量级远程服务

远程过程调用(RPC)是分布式系统和微服务架构中的核心技术,它允许程序像调用本地函数一样执行远程服务,从而简化了跨进程或网络边界的通信。其核心原理在于对调用过程进行封装、序列化、网络传输与反序列化,以实现位置透明性。JSON-RPC作为一种基于JSON的轻量级RPC协议,凭借其语言无关、协议简洁和易于调试的特点,在快速原型开发、IoT网关及多语言服务集成等场景中展现出独特的技术价值。libjson-rpc-cpp库为C++开发者提供了完整的JSON-RPC 2.0框架实现,通过规范文件(Specificat

weixin_30873847的博客 398

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ONNX 完整安装指南:从 PyPI 一键安装到跨平台源码编译

本文是 ONNX 开源仓库(onnx/onnx)官方安装文档的系统化技术指南,覆盖官方二进制包、vcpkg、Conda、Pixi 以及手动管理依赖的源码构建四条路径,并针对 Windows / Linux / macOS 三大平台给出可直接复制的命令与 Protobuf 依赖处理方案。读完本文,你将掌握 ONNX 各安装方式的适用场景、构建参数(`ONNX_USE_PROTOBUF_SHARED_

gitblog_00339的博客 570

C++ JSON-RPC框架libjson-rpc-cpp实战:从原理到异构系统集成

远程过程调用(RPC)是构建分布式系统和实现微服务间通信的核心技术,它允许程序像调用本地函数一样调用网络上的服务。JSON-RPC作为一种基于JSON的轻量级协议,因其文本可读、跨语言支持良好而广泛应用于异构系统集成。libjson-rpc-cpp框架封装了协议解析、网络通信和序列化等底层细节,通过桩代码生成器自动化接口绑定,显著提升了C++项目中RPC开发的效率。该框架支持HTTP、TCP Socket等多种可插拔的传输层,便于根据性能与通用性需求进行选型。在涉及C++与Python、JavaScript

weixin_33738982的博客 342

C++ 第四阶段项目一:实现 JSON 解析器

摘要:本文详细介绍了使用C++实现JSON解析与序列化的设计方案。项目实现了一个完整的JSON处理库,支持基本数据类型、嵌套结构以及转义字符处理。采用递归下降算法进行语法分析,使用智能指针管理内存,并提供了友好的错误处理机制。核心功能包括JSON字符串解析、数据结构序列化,同时预留了注释支持、文件读写等扩展接口。项目通过类继承体系实现多态处理,优化了内存管理和格式化输出,并提供了详细的调试方法与单元测试建议。

弘羽 1027

字节跳动高性能C++实践|高效JSON库

sonic-cpp 是由字节跳动 STE 团队和服务框架团队共同研发的一款面向 C++ 语言的高效 JSON 库,极致地利用当前 CPU 硬件特性与向量化编程,大幅提高了序列化反序列化性能,解析性能为 rapidjson 的 2.5 倍。sonic-cpp 在字节内部上线以来, 已为抖音、今日头条等核心业务,累计节省了数十万 CPU 核心。今天我们正式对外开源 sonic-cpp,希望能够帮助更多...

极客重生 3415

Windows C++原生集成AI聊天:ChatAI-Cpp库实战指南

在现代软件开发中,API集成是连接本地应用与云端服务的关键技术。其核心原理是通过网络协议封装请求与解析响应,实现跨平台功能调用。这项技术的价值在于能够将强大的云端能力无缝嵌入到原生应用中,无需引入额外的运行时环境或依赖。在工程实践中,C++开发者常面临跨语言调用复杂、性能开销大的挑战,尤其是在Windows平台与MSVC编译环境下。ChatAI-Cpp库正是针对这一痛点设计的轻量级解决方案,它基于openai-cpp进行二次开发,专注于聊天完成功能,并深度适配Windows平台。通过原生C++集成,开发者可

weixin_33816821的博客 396

JSON11: 简洁高效的JSON库,为C++开发者的理想选择

[THE 0TH POSITION OF THE ORIGINAL IMAGE](https://github.com/dropbox/json11) 在现代软件开发中,JSON(JavaScript Object Notation)已经成为了数据交换的主要格式。对于C++开发者来说,找到一个既易于使用又高效可靠的JSON处理库至关重要。【项目链接】 提供了一个轻量级、灵活且高度兼容的解决方...

gitblog_00058的博客 1970
上一篇: 关于宏的制表功能
下一篇: 数据库的偏见—总论
FlyAnyWhere
博客等级 码龄24年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值