2016-05-03 18 views
9

Tôi mới sử dụng ngôn ngữ C. Tôi cần phải thêm hai mảng json_object được tạo bằng thư viện json-c. Đây là mã của tôi:Nối json_object_arrays bằng C bằng thư viện jsonc

struct json_object *obj1,*array1,*array2,*array3; 

obj1 = json_object_new_object();  

array1 = json_object_new_array(); 
json_object_array_add(array1, json_object_new_int(1)); 
json_object_array_add(array1, json_object_new_int(2)); 
json_object_array_add(array1, json_object_new_int(3)); 

json_object_object_add(obj1, "array1", array1); 

array2 = json_object_new_array(); 
json_object_array_add(array2, json_object_new_int(4)); 
json_object_array_add(array2, json_object_new_int(5)); 
json_object_array_add(array2, json_object_new_int(6)); 

json_object_object_add(obj1, "array2", array2); 

json_object_object_add(obj1, "array3", array1+array2); 

Nhưng tôi đã nhận lỗi sau:

error: invalid operands to binary + (have ‘struct json_object *’ and ‘struct json_object *’) json_object_object_add(obj1, "array3", array1+array2);

Đây có phải là không thể? Tôi cần đầu ra như thế này:

{ 
    "array1:[1,2,3], 
    "array2":[4,5,6], 
    "array3":[1,2,3,4,5,6] 
} 

Hoặc là nó có thể để thêm một mảng C nguyên bình thường để Json, như thế này

int32_t smp[100]={0}; 

smp[0] = 1; 
smp[1] = 2; 
smp[2] = 3; 
smp[3] = 4; 
smp[4] = 5; 
smp[5] = 6; 

json_object_object_add(obj1, "array3", smp); 
+4

'array1 + array2' là không thể trong C. – BLUEPIXY

+0

sau đó làm thế nào để thêm json_object_arrays –

+0

Tôi không biết thư viện json-c, xin lỗi. – BLUEPIXY

Trả lời

2

Theo như tôi biết, không có "built-in" chức năng trong json-c để nối hai mảng, nhưng bạn có thể dễ dàng tạo ra một:

struct json_object * json_object_array_concat (struct json_object *array1, 
               struct json_object *array2) { 
    struct json_object *array3 = json_object_new_array(); 
    if (!array3) { 
     return NULL; 
    } 
    int i, 
     size1 = json_object_array_length(array1), 
     size2 = json_object_array_length(array2); 
    for (i = 0; i < size1; ++i) { 
     json_object_array_add(array3, json_object_array_get_idx(array1, i)); 
    } 
    for (i = 0; i < size2; ++i) { 
     json_object_array_add(array3, json_object_array_get_idx(array2, i)); 
    } 
    return array3; 
} 

Sau đó, để sử dụng nó:

array3 = json_object_array_concat(array1, array2); 

Nếu bạn chỉ muốn thêm array2 để array1:

struct json_object * json_object_array_append (struct json_object *array1, 
               struct json_object *array2) { 
    int i, 
     size2 = json_object_array_length(array2); 
    for (i = 0; i < size2; ++i) { 
     json_object_array_add(array1, json_object_array_get_idx(array2, i)); 
    } 
    return array1; 
} 
0

Chỉ cần nhớ rằng câu trả lời ở trên không giải quyết được đếm tham chiếu trong json-c. Họ thêm các đối tượng vào mảng đích, nhưng không có nó sở hữu chúng. Họ có khả năng sẽ gây ra segfaults, vv

Các doc: "The reference count will not be incremented."

Để đảm bảo quyền sở hữu được tổ chức bởi cả hai mảng, bạn cần một cái gì đó như thế này:

void json_object_array_append(json_object *dest, json_object *src) { 
    int i; 
    int src_size = json_object_array_length(src); 
    for (i = 0; i < src_size; ++i) { 
     json_object *src_item = json_object_array_get_idx(src, i); 
     json_object_get(src_item); // increment reference count 
     json_object_array_add(dest, src_item); // add to dest array 
    } 
} 

// optional: if you are disposing of the src array, you can then do this: 
json_object_put(src); 
// after calling the append function. 
Các vấn đề liên quan