如何在json-c中删除数组元素?

时间:2015-02-16 11:55:58

标签: arrays json

假设以下JSON对象是[epoch,value]数组的数组:

[ [0,1], [1912312314,2], [1912312857,5] ]

删除数组元素的正确方法是什么?这个想法是删除一个epoch桤木而不是给定值的那个。我使用json-c 0.11。

我试过了:

   json_object *jsonHeatmapObj;
   jsonHeatmapObj = json_tokener_parse ( "[ [0,1], [1912312314,2], [1912312857,5] ]" );

    for ( int idx=0 ; idx < json_object_array_length(jsonHeatmapObj) ; idx++ ) {
       json_object *curJsonHeatpointObj = json_object_array_get_idx ( jsonHeatmapObj , idx );
       int x = json_object_get_int ( json_object_array_get_idx ( curJsonHeatpointObj , 0 ) );
       if ( x < time(NULL) - 10 ) {
          json_object_put ( curJsonHeatpointObj );
       }
       printf("\t[%d]=%s\n", idx, json_object_to_json_string(jsonHeatmapObj));
    }

使用调整后的对象调用json_object_to_json_string()时失败(SIGSEGV)。

谢谢

1 个答案:

答案 0 :(得分:1)

我认为该代码存在两个独立的问题:一个是它正在使用json_object_put,好像json_object_array_get_idx删除了它从原始数组返回的元素(一些根本不清楚的东西)来自API documentation),其次它使用time(NULL)就像它返回一个整数一样,但它返回一个time_t结构。

第一个可以通过创建一个新的JSON数组来解决,如果条件满足则只包含其中的项目。在这里,我通过使用设置为数组中最大值的时间来避免第二个问题:

struct json_object *newHeatMap = json_object_new_array();
for ( int idx=0 ; idx < json_object_array_length(jsonHeatmapObj) ; idx++ ) {
    json_object *curJsonHeatpointObj = json_object_array_get_idx ( jsonHeatmapObj , idx );
    int x = json_object_get_int ( json_object_array_get_idx ( curJsonHeatpointObj , 0 ) );
    if ( x < 1912312857 ) {
        json_object_array_add(newHeatMap, curJsonHeatpointObj);
    }
    printf("\t[%d]=%s\n", idx, json_object_to_json_string(newHeatMap));
}

我得到以下结果,我希望你能看到这些结果:

$ gcc -I/opt/local/include -L/opt/local/lib/ -ljson-c main.c && ./a.out example.json
    [0]=[ [ 0, 1 ] ]
    [1]=[ [ 0, 1 ], [ 1912312314, 2 ] ]
    [2]=[ [ 0, 1 ], [ 1912312314, 2 ] ]

例如here on SO

已经回答了第二个问题