我正在处理一个操纵roomba的项目。我使用的RooWifi微控制器经常将传感器数据写入json文件,我试图获取json,解析它,并将我的操作基于输出。
我在从URL抓取json的数据时遇到问题。该文件位于一个地址,比如说
http://10.0.0.1/roomba.json
我可以手动将地址输入Chrome并查看数据。但是,当我以编程方式获取json文件时,数据值为零。
json的格式以及我在Chrome中的显示方式是:
{
"response": {
"r13": {
"name": "Angle",
"value": "0"
},
"r14": {
"name": "Charging State",
"value": "4"
},
"r18": {
"name": "Charge",
"value": "863"
},
"r19": {
"name": "Capacity",
"value": "1618"
}
}
}
以编程方式返回的是:
{
"response": {
"r13": {
"name": "Angle",
"value": "0"
},
"r14": {
"name": "Charging State",
"value": "0"
},
"r18": {
"name": "Charge",
"value": "0"
},
"r19": {
"name": "Capacity",
"value": "0"
}
}
}
我正在使用Qt Creator和c ++。我对c ++并不十分精通,从未使用过Qt(库函数与此打包),所以我认为我第一次使用Qt json解析器和url请求的尝试是错误的。然后我在https://stackoverflow.com/a/13096222/2415349复制了Evgeny的代码。他的代码检索json文件,但是所有的'值都是'是零。
我尝试将fetch / parse函数放在循环中,但每次都返回相同的内容。
奇怪的是,我可以使用json和urllib2库在python中获取带有填充值的json文件。
任何人都可以解释为什么会这样吗?我只解析过我机器上的文件。当roomba被关闭时,请求是否只能获得默认的json?我的计算机或浏览器是否需要以某种方式设置(我正在使用Mac OSX 10.9.4)。
编辑:这是我从Evgeny的回答中使用的代码(也使用了get_http())
string get_http(const string &server,const string &path);
using namespace boost::property_tree;
stringstream temp;
temp << get_http("10.0.0.1","/roomba.json");
cout << "Original JSON:" << endl;
cout << temp.str();
cout << string(256,'*') << endl;
ptree root;
read_json(temp,root);
cout << "Printed as XML:" << endl;
write_xml(cout,root);
当temp.str()和root被打印到cout时,我看到了上面提到的输出。
编辑2:
我意识到请求正在返回相同的json。我原来的设置是运行应用程序,并观察程序返回的输出。然后我会停止应用程序,并手动转到10.0.0.1/roomba.json。
有没有人知道为什么当应用程序运行时json文件被设置为全零,但是当它不是(但我连接到设备)时,json文件输出数据?