2016-05-03 11 views
9

Sono nuovo al linguaggio C. Devo aggiungere due array json_object creati con la libreria json-c. Questo è il mio codice:Aggiungi json_object_arrays in C utilizzando la libreria 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); 

ma ho ottenuto il seguente errore:

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

questo non è possibile? Ho bisogno di output come questo:

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

Oppure è possibile aggiungere una normale serie C intero a JSON, come questo

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' non è possibile in C. – BLUEPIXY

+0

poi come aggiungere json_object_arrays –

+0

Non conosco la libreria json-c, mi dispiace. – BLUEPIXY

risposta

2

Per quanto ne so, non c'è "built-in" funzione json-c per concatenare due array, ma si può facilmente creare uno:

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; 
} 

Poi, per usarlo:

array3 = json_object_array_concat(array1, array2); 

Se solo si desidera aggiungere array2 a 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

Basta ricordare che le risposte di cui sopra non affrontano i conteggi di riferimento in JSON-c. Aggiungono gli oggetti alla matrice di destinazione, ma non ce la fanno assumerne la proprietà. Essi saranno probabilmente causerà segfaults ecc

Il dottore: "The reference count will not be incremented."

Per assicurarsi che la proprietà è detenuta da entrambi gli array, avete bisogno di qualcosa di simile:

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. 
Problemi correlati