C++ 生成简单JSON键值对象的最有效方法。编译时字符串?

C++ 生成简单JSON键值对象的最有效方法。编译时字符串?,c++,json,performance,optimization,printf,C++,Json,Performance,Optimization,Printf,我目前正在使用一个非常简单的JSON对象与我的平台通信。例如,它们遵循以下格式: {"key":"value","key2":"value2"} 为了避免各种JSON库的开销,我目前使用一个简单的sprintf语句生成JSON对象: sprintf("{\"key\":\"%s\",\"key\":\"%d\"}"), buffer, value, nValue); 这很好,因为我生成的缓冲区直接发送到tcp套接字,我不必从JSON库类型转换为char*。问题是格式化JSON很不方便,尤其是

我目前正在使用一个非常简单的JSON对象与我的平台通信。例如,它们遵循以下格式:

{"key":"value","key2":"value2"}

为了避免各种JSON库的开销,我目前使用一个简单的sprintf语句生成JSON对象:

sprintf("{\"key\":\"%s\",\"key\":\"%d\"}"), buffer, value, nValue);
这很好,因为我生成的缓冲区直接发送到tcp套接字,我不必从JSON库类型转换为char*。问题是格式化JSON很不方便,尤其是转义引号。我想要一个更方便的语法,同时仍然只分配一个缓冲区。我的想法是为它创建一个包装函数,并在编译时生成传递给sprintf的格式字符串。导致类似于以下情况的使用案例:

jsonHelperFunction(&buffer, key, value, key2, value2);

helper函数可能必须使用模板,但我不确定如何使用它们来生成sprintf使用的格式字符串。有人知道如何在编译时高效地执行此操作吗?

我将创建几个简单的类来表示少数JSON类型:值、映射等。。。对于复合对象(如贴图),添加子值的简单方法。然后使用“格式化”方法将所有内容递归格式化为
std::ostream
。然后,整个过程可以简单地在
auto
范围(在堆栈上)中实例化,然后格式化为
std::ostringstream
,生成可以写出的
std::string
。没有堆分配。不必担心粗糙的C风格
sprintf()
方法会导致缓冲区溢出。“避免各种JSON库的开销”通常意味着“我正在重新发明轮子,死角案例会咬我的屁股”。说真的,请使用真正的JSON序列化程序,不要尝试自己重新创建它。当你的一个值包含双引号字符时,你就会爆发。旁注:如果你对所有的反斜杠转义感到恼火,你可能想看看它,它允许你使用任意复杂的分隔符,这样你就不需要在字符串中使用转义符了。为什么要使用sprintf?让助手函数改用ostringstream,这样就不需要生成格式字符串。