我曾在C ++工作,但几年前,过去5年左右,我几乎只是在Objective C工作,也许我很乐意这样做。
但是我正在编写一个C ++ json-parser并且它在概念上很难,因为没有像Objective C那样的自然映射。我不是说它的方式或其他方式更好,只是声明我没有找到自然映射。
所以在Objective C中我通常会开始将json解析为NSDictionary,因为它映射得非常好。 NSDictionary是一个键值对数据类型,其中键通常是一个字符串(但可以是任何类型),并且值通常是NSObject(概念上),并且在Objc中,所有内容都继承NSObject,因此类型是“自动多态的” “如果你愿意的话。 (给出任何C ++开发人员的解释,如果我不解释Objc,可能会确切知道如何帮助我但不明白我要求的内容。)
无论如何这意味着如果我有一个例子json-string:
{"key":1, "key2":3.14, "key3":"hello world", "key4":[1,2,3]}
它已经完全映射到NSDictionary,其中第一个值是整数(或数字),第二个是浮点数(或数字),第三个是NSString,第四个是NSArray,它包含三个值,恰好是我的整数例如,只要它来自NSObject,就可以是任何东西。
在C ++中,我很难理解并找到一个好的映射或模型,我想我可以滚动自己的多态类型来做同样的事情,然后我可以有一个抽象类型的地图并且变得漂亮大致相同的行为。
但要么我想我需要编写自己的容器(地图和矢量)或者编写我自己的“Json-types”。然而,我有点害怕被Objc中的权利所困扰,因为它是一种非常不同的语言,并且建立在与C ++完全不同的设计思想上。
也许有更好,更正确的方法在C ++中做这样的事情,我只是不知道。所以我的问题是如何在C ++中以一种好的方式处理可能有不同类型的东西。
答案 0 :(得分:1)
首先是一个免责声明,当我在这里讨论Objective C时,我真的包含了很多Cocoa,我认为大多数读者会无缝地将其读入其中,但是当我谈到Cocoa特定的东西时,要明确它这只是我真的习惯使用Cocoa和Objective C(即OSX开发)。
嗯,我有一些输入,我可能会在这里找到的解决方案是擅长Boost
。所以这意味着我将json dictionaries
解析为std::map <std::string, boost::any>
,将我的数组/向量解析为std::vector <boost::any>
,这样可以将硬打字放松到更适合数据描述格式的级别比如json。
感谢所有人在这里发表评论和帮助!
最棒的是,即使这是我的json-parser,它确实给了我更多的视角,所以我觉得我遇到过类似的问题,因为在编码类型较少的语言中被宠坏了,有一个更开放(或我想,取决于你如何看待)对象架构。希望其他人也会发现这个问题也很有用!