大佬教程收集整理的这篇文章主要介绍了用于在C中表示JSON的数据类型,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template <class T> class JSONNode { const char *key; T value; }@H_675_2@虽然这似乎是有希望的,但是当开始使用它时,我意识到当我尝试将节点排序成容器类型(如数组,unordered_map等)时遇到麻烦,因为他们仍然想知道该JSONNode的类型!如果一个节点被定义为JSONNode< int>而另一个是JSONNode< float>那么将它们放在容器中将是有问题的. @H_675_2@所以我转过去,我不是都有兴趣把它们保存在一个容器里,我会很高兴让他们自我意识或称之为,即广告指向下一个节点,但再次弄清楚节点的类型变得棘手,就在这里,我开始思考多态. @H_675_2@多态性
class JSONNode { public: const char *key; //?? typed value,can't set a type }; class JSONnumberNode : public JSONNode { public: int value; } class JSONStringNode : public JSONNode { public: const char *value; }@H_675_2@起初我以为这是要走的路.但是,当我开始考虑如何处理这个值时,我意识到我无法访问该值,即使我写了一个特定的函数来检索该值,它会返回什么呢? @H_675_2@所以我确实有对象具有不同的类型值,但是如果没有首先转换到正确的类型,我就无法访问它们,@R_698_9447@做一个dynamic_cast< JSONStringNode>(some_nodE);但是我怎么知道怎么把它转换至? RTTI?那么我觉得在这一点上它只是一个复杂的事情,我想我可能可以使用一个typeof或decltype来确定它的类型,但是还没有成功. @H_675_2@POD类型
{ "foo":5 }@H_675_2@你加载这个JSON文件,你会得到的只是你的POD“包装器”.
json_wrapper wrapper = load_file("example.json");@H_675_2@现在你假设你加载的JSON节点是一个JSON对象.你现在必须处理两种情况:它是一个对象,还是不是对象.如果不是,您可能会遇到错误状态,因此可以使用异常.但是如何提取对象本身?好吧,只需要一个函数调用.
try { JsonObject root = wrapper.as_object(); } catch(JSONReadException E) { std::cerr << "Something went wrong!" << std::endl; }@H_675_2@现在如果由包装器包装的JSON节点确实是一个JSON对象,那么可以继续尝试{块,无论你想对对象做什么.同时,如果JSON是“格式错误的”,你可以进入catch(){Block. @H_675_2@在内部你会实现这样的东西:
class JsonWrapper { enum NodeType { Object,number,... }; NodeType type; union { JsonObject object; double number }; JsonObject as_object() { if(type != Object) { throw new JSONReadException; } else { return this->object; } }
以上是大佬教程为你收集整理的用于在C中表示JSON的数据类型全部内容,希望文章能够帮你解决用于在C中表示JSON的数据类型所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。