我正在尝试读入一个JSON文件。到目前为止,我一直专注于使用jsoncpp
库。然而,文档对我来说很难理解。有人能用通俗的术语解释一下它的作用吗?
假设我有一个people.json
,如下所示:
{"Anna" : {
"age": 18,
"profession": "student"},
"Ben" : {
"age" : "nineteen",
"profession": "mechanic"}
}
当我读到这个的时候会发生什么?我可以创建某种数据结构people
,我可以通过Anna
和Ben
以及age
和profession
来索引它吗?people
的数据类型是什么?我认为它类似于(嵌套的)map,但是map值总是必须具有相同的类型,不是吗?
我以前使用过python,我的“目标”(对于C++来说可能是病态的)是获得一个嵌套python字典的等价物。
8条答案
按热度按时间dwthyt8l1#
1.可以创建嵌套数据结构
people
,它可以通过Anna
和Ben
索引,但是不能直接通过age
和profession
索引(我将在代码中介绍这一部分)。people
的数据类型为Json::Value
(在jsoncpp中定义).你是对的,它类似于嵌套Map,但是Value
是定义为可以存储和访问多种类型的数据结构,类似于以string
为键、以Json::Value
为值的Map。它也可以是作为键的unsigned int
和作为值的Json::Value
之间的Map(在json数组的情况下)。下面是代码:
正如您所看到的,您只能基于输入数据的层次结构来索引JSON对象。
xfb7svmp2#
看看nlohmann's JSON Repository on GitHub,我发现它是使用JSON最方便的方法。
它被设计成像STL容器一样工作,这使得它的使用非常直观。
66bbxpm53#
基本上,javascript和C的工作原理是不同的。Javascript创建了一个“关联数组”或哈希表,它匹配一个字符串键(字段名)和一个值。C在内存中布局结构,所以前4个字节是一个整数,这是一个年龄,然后我们可能有一个固定长度的32字节字符串来表示“职业”。
所以javascript可以处理诸如“age”在一个记录中是18而在另一个记录中是“ninteen”这样的事情,而C不能(然而C要快得多)。
因此,如果我们想在C中处理JSON,我们必须从头开始构建关联数组,然后我们必须用类型标记值,它是整数还是真实的数值(可能返回为“double”)、布尔值、一个字符串?由此可见,一个JSON C类是相当大的一块代码。实际上,我们所做的是在C中实现一点JavaScript引擎。然后,我们将JSON作为字符串传递给JSON解析器,解析器将其标记化,并为我们提供从C查询JSON的函数。
abithluo4#
你可以使用c++ boost::property_tree::ptree来解析json数据。下面是你的json数据的例子。如果你在每个子节点中移动名字,这会更容易
yh2wf1be5#
fedora 33的完整最小工作示例
使用
sudo dnf install jsoncpp-devel
获取库。将以下文件存储在项目文件夹中:
使用
g++ -ljsoncpp main.cpp
编译。调用./a.out
将生成agyaoht76#
读取json配置文件的示例(带有完整的源代码):
https://github.com/sksodhi/CodeNuggets/tree/master/json/config_read
44u64gxh7#
下面是另一种更容易读入json文件的方法:
然后,您可以获得如下所示的值:
lymnna718#
储存这样的人
会引起问题,特别是如果不同的人有相同的名字。
而不是像这样使用数组存储对象
像这样,你可以枚举对象,或者通过数字索引访问对象。记住json是存储结构,而不是动态排序器或索引器。使用存储在json中的数据来根据你的需要建立索引并访问数据。