假设以下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)。
谢谢
答案 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 ] ]
已经回答了第二个问题