我想创建一个包含我的类的实例变量的JSON字符串.
例如,
class Example {
std::string string;
std::map<std::string, std:string> map;
std::vector<int> vector;
};
Run Code Online (Sandbox Code Playgroud)
会成为:
{
"string":"the-string-value",
"map": {
"key1":"val1",
"key2":"val2"
},
"vector":[1,2,3,4]
}
Run Code Online (Sandbox Code Playgroud)
我已经研究了几个用于创建JSON的C++库,它们看起来都非常复杂.我想要类似于Javascript的东西JSON.stringify(object).换句话说,只需将std :: map传递给它并接收一个字符串.地图可以包含其他地图,矢量,列表,字符串,数字和布尔.
最好的方法是什么?
谢谢你的帮助.
编辑
我调查了以下内容:
json spirit,jsoncpp,zoolib,JOST,CAJUN,libjson,nosjob,JsonBox,jsonme--
据我所知,我可以构建一个单独的JSON对象,如下面的答案和转换为JSON我希望能够将我的东西存储在标准集合中并进行转换.
编辑2
好吧,废弃了序列化类的想法,因为看起来C++缺乏反射是不可能的.
有没有一种很好的方法将包含std:maps,std :: vectors,std :: lists,numbers,strings和bools的std :: map转换为JSON,而无需更改数据类型或将数据复制到新的数据类型?
谢谢.
我正在研究多线程代码的覆盖标准,并且它希望记录对变量的访问.例如,在下面的代码中,我想记录该变量x被写入y, z, a[i],并且我被读取.
x = y * (int)z + a[i]
Run Code Online (Sandbox Code Playgroud)
我一直在使用Clang的RecursiveASTVisitor并修改源代码以包含录制功能.但是,我不确定这是否是一种明智的方法,因为我对Clang如何工作的理解是非常不完整的.
目前,当我找到一个声明时,我会检查它是否是一个BinaryOperator, UnaryOperator, Cast, or DeclRefExpr.(一旦我掌握了基础知识,我将扩展其能力.)如果是,BinaryOperator, UnaryOperator, or Cast我检查表达式的子表达式.如果它是DeclRefExpr我可以检查表达式是左值还是右值(再次,现在简化),但是一旦我找到DeclRefExpr它们总是左值.为了确定它们是否被使用,因为lvalues or rvalues我必须检查它的父项,如果它是一个lvaluetorvalue,它被用作右值.
我非常觉得我对这个问题采取了错误的方法,因为我只能看到它变得更加复杂,因为我必须考虑更复杂的代码.
有没有更好的方法来解决这个问题?
谢谢
编辑
我不打算静态记录这些信息.我打算找到变量的使用和插入代码,这些代码将在代码运行时记录对这些变量的访问.
例如,给定上面的代码(x = y * (int)z + a[i];),我想生成类似的东西
x = y * (int)z + a[i];
recordAccess(<file>, <line>, "x", &x, WRITE);
recordAccess(<file>, <line>, "y", &y, READ);
recordAccess(<file>, <line>, "z", &z, READ);
recordAccess(<file>, <line>, "a[i]", &a[i], READ);
recordAccess(<file>, <line>, "i", &i, READ);
Run Code Online (Sandbox Code Playgroud)