使用json-c库解析json数组

问题描述

我从服务器返回了以下 JSON 数据,但我无法弄清楚如何解析叙述的机动数组:

{
"maneuvers": [
          {
            "signs": [],"index": 0,"maneuverNotes": [],"direction": 8,"narrative": "Start out going east on Clarendon Blvd toward N Queen St.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/icon-dirs-start_sm.gif","distance": 0.031,"time": 6,"linkIds": [],"streets": [
              "Clarendon Blvd"
            ],"attributes": 0,"transportMode": "AUTO","formattedTime": "00:00:06","directionName": "East","mapUrl": "http://www.mapquestapi.com/staticmap/v4/getmap?key=KEY&type=map&size=225,160&pois=purple-1,38.893164999999996,-77.077957,0|purple-2,38.893276,-77.077407,0|&center=38.8932205,-77.077682&zoom=15&rand=-1645843521&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.077957,"lat": 38.893165
            },"turnType": 2
          },{
            "signs": [],"index": 1,"direction": 4,"narrative": "Turn right onto N Queen St.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/rs_right_sm.gif","distance": 0.168,"time": 32,"streets": [
              "N Queen St"
            ],"formattedTime": "00:00:32","directionName": "South",160&pois=purple-2,0|purple-3,38.890857,-77.07708699999999,0|&center=38.8920665,-77.077247&zoom=12&rand=-1645843521&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.077407,"lat": 38.893276
            },"index": 2,"direction": 7,"narrative": "Turn right onto 14th St N.","distance": 0.003,"time": 5,"streets": [
              "14th St N"
            ],"formattedTime": "00:00:05","directionName": "West",160&pois=purple-3,0|purple-4,38.890842,-77.077148,0|&center=38.8908495,-77.07711749999999&zoom=15&rand=-1646228270&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.077087,"lat": 38.890857
            },{
            "signs": [
              {
                "text": "50","extraText": "","type": 2,"url": "http://icons.mqcdn.com/icons/rs2.png?n=50&d=WEST"
              }
            ],"index": 3,"narrative": "Merge onto Arlington Blvd/US-50 W via the ramp on the left.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/rs_merge_left_sm.gif","distance": 1.606,"time": 151,"streets": [
              "Arlington Blvd","US-50 W"
            ],"formattedTime": "00:02:31",160&pois=purple-4,0|purple-5,38.87355,-77.089424,0|&center=38.882196,-77.08328599999999&zoom=9&rand=-1646228270&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.077148,"lat": 38.890842
            },"turnType": 11
          },"index": 4,"narrative": "Turn left onto N Fillmore St.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/rs_left_sm.gif","distance": 0.408,"time": 74,"streets": [
              "N Fillmore St"
            ],"formattedTime": "00:01:14",160&pois=purple-5,0|purple-6,38.867782,-77.08811899999999,0|&center=38.870666,-77.0887715&zoom=10&rand=-1646228270&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.089424,"lat": 38.87355
            },"turnType": 6
          },"index": 5,"narrative": "Stay straight to go onto S Walter Reed Dr.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/rs_straight_sm.gif","distance": 0.884,"time": 149,"streets": [
              "S Walter Reed Dr"
            ],"formattedTime": "00:02:29",160&pois=purple-6,0|purple-7,38.855185999999996,-77.088584,0|&center=38.861484,-77.08835149999999&zoom=9&rand=-1646228270&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.088119,"lat": 38.867782
            },"turnType": 0
          },{
            "signs": [
              {
                "text": "120","direction": 0,"type": 545,"url": "http://icons.mqcdn.com/icons/rs545.png?n=120"
              }
            ],"index": 6,"direction": 5,"narrative": "Turn slight left onto S Glebe Rd/VA-120.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/rs_slight_left_sm.gif","distance": 0.593,"time": 84,"streets": [
              "S Glebe Rd","VA-120"
            ],"formattedTime": "00:01:24","directionName": "Southeast",160&pois=purple-7,0|purple-8,38.848926,-77.08122999999999,0|&center=38.852056,-77.08490699999999&zoom=10&rand=-1646228270&session=55e60cd9-00b6-001a-02b7-20ac-00163e7dd551","startPoint": {
              "lng": -77.088584,"lat": 38.855186
            },"turnType": 7
          },"index": 7,"narrative": "2400 S GLEBE RD is on the right.","iconUrl": "http://content.mapquest.com/mqsite/turnsigns/icon-dirs-end_sm.gif","distance": 0,"time": 0,"streets": [],"formattedTime": "00:00:00","directionName": "","startPoint": {
              "lng": -77.08123,"lat": 38.848926
            },"turnType": -1
          }
        ]
}

我正在使用 json-c 库。我尝试使用循环并获取数组中的索引号,但由于出错而无法正确执行。

我将如何访问演习中的叙述部分?

编辑:我得到的错误是当我使用 json_object_array_length(maneuvers) 时,它说机动不是有效的 json 对象。请注意,mauevers 已经是我从父 json-object 解析的数组

解决方法

如果您向我们展示一些代码以及您遇到的错误,将会很有帮助。

您应该使用 json_object_from_file 读取 JSON 文件,然后使用 json_object_object_get 获取某个键下的元素。

非常简单的代码(省略了错误检查,以及类型检查——例如,我从不检查 maneuvers 是否确实是一个数组):

json_object *root = json_object_from_file("path/to/file.json");
json_object *maneuvers = json_object_object_get(root,"maneuvers");
int maneuvers_count = json_object_array_length(maneuvers);
for (int i = 0; i < maneuvers_count; i++)
{
    json_object *element = json_object_array_get_idx(maneuvers,i);
    json_object *narratives = json_object_object_get(element,"narratives");
    char *narratives_str = json_object_get_string(narratives);
}

有关一些教程,请参阅 https://github.com/rbtylee/tutorial-jsonc/blob/master/tutorial/index.md