Libjansson: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
(Created page with "== Overview == Json library Jansson 정보 정리. == API manual == * http://jansson.readthedocs.org/en/2.7/apiref.html - v2.7 == References == <references /> category:li...")
 
No edit summary
Line 4: Line 4:
== API manual ==
== API manual ==
* http://jansson.readthedocs.org/en/2.7/apiref.html - v2.7
* http://jansson.readthedocs.org/en/2.7/apiref.html - v2.7
== json_array ==
=== json_array_foreach ===
json_array_foreach() 함수는 json array 에 있는 모든 요소들을 하나씩 살펴볼 때 사용하면 유용하다. 하지만, 루프를 도는 도중, 입력된 array의, 항목이 삭제가 되는 등의 변화가 발생하게 되면 삭제와 동시에 내부 정렬이 다시 초기화 되면서 의도치 않는 결과가 나오게 된다.
따라서, json_array_foreach() 함수의 사용도중에 항목을 삭제하기 위해서는 많은 주의가 요구된다.
<source lang=c>
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <jansson.h>
int get_array_idx(const json_t* j_arr, const char* value)
{
    int ret;
    json_t* j_tmp;
    int idx;
    const char* tmp;
   
    json_array_foreach(j_arr, idx, j_tmp)
    {       
        if(j_tmp == NULL)
        {
            printf("Err.\n");
        }
       
        tmp = json_string_value(j_tmp);
        ret = strcmp(tmp, value);
        if(ret == 0)
        {
            break;
        }
    }
   
    ret = json_array_size(j_arr);
    if(idx >= ret)
    {
        return -1;
    }
    return idx;
}
int main(int argc, char** argv)
{
    json_t* j_arr;
    json_t* j_err;
    json_t* j_tmp;
    char* tmp;
    const char* tmp_value;
    int idx;
    int i;
    int ret;
   
    j_arr = json_array();
    for(i = 0; i < 10; i++)
    {
        asprintf(&tmp, "%d", i);
        json_array_append_new(j_arr, json_string(tmp));
        free(tmp);
    }
   
    tmp = json_dumps(j_arr, JSON_ENCODE_ANY);
    printf("result. tmp[%s]\n", tmp);
    free(tmp);
   
    // check errors.
    j_err = json_array();
    json_array_foreach(j_arr, idx, j_tmp)
    {       
        if(j_tmp == NULL)
        {
            printf("Err.\n");
        }
           
        if((idx == 3) || (idx == 5))
        {
            json_array_append(j_err, j_tmp);
        }
    }
   
    json_array_foreach(j_err, idx, j_tmp)
    {
        tmp_value = json_string_value(j_tmp);
       
        ret = get_array_idx(j_arr, tmp_value);
        if(ret == -1)
        {
            continue;
        }
        json_array_remove(j_arr, ret);
    }
   
    tmp = json_dumps(j_arr, JSON_ENCODE_ANY);
    printf("result. tmp[%s]\n", tmp);
    free(tmp);
   
    json_decref(j_arr);
    json_decref(j_err);
       
    return 0;
}
</source>


== References ==
== References ==

Revision as of 12:08, 6 August 2015

Overview

Json library Jansson 정보 정리.

API manual

json_array

json_array_foreach

json_array_foreach() 함수는 json array 에 있는 모든 요소들을 하나씩 살펴볼 때 사용하면 유용하다. 하지만, 루프를 도는 도중, 입력된 array의, 항목이 삭제가 되는 등의 변화가 발생하게 되면 삭제와 동시에 내부 정렬이 다시 초기화 되면서 의도치 않는 결과가 나오게 된다.

따라서, json_array_foreach() 함수의 사용도중에 항목을 삭제하기 위해서는 많은 주의가 요구된다. <source lang=c>

  1. define _GNU_SOURCE
  1. include <stdio.h>
  2. include <stdlib.h>
  3. include <string.h>
  4. include <jansson.h>

int get_array_idx(const json_t* j_arr, const char* value) {

   int ret;
   json_t* j_tmp;
   int idx;
   const char* tmp;
   
   json_array_foreach(j_arr, idx, j_tmp)
   {        
       if(j_tmp == NULL)
       {
           printf("Err.\n");
       }
       
       tmp = json_string_value(j_tmp);
       ret = strcmp(tmp, value);
       if(ret == 0)
       {
           break;
       }
   }
   
   ret = json_array_size(j_arr);
   if(idx >= ret)
   {
       return -1;
   }
   return idx;

}


int main(int argc, char** argv) {

   json_t* j_arr;
   json_t* j_err;
   json_t* j_tmp;
   char* tmp;
   const char* tmp_value;
   int idx;
   int i;
   int ret;
   
   j_arr = json_array();
   for(i = 0; i < 10; i++)
   {
       asprintf(&tmp, "%d", i);
       json_array_append_new(j_arr, json_string(tmp));
       free(tmp);
   }
   
   tmp = json_dumps(j_arr, JSON_ENCODE_ANY);
   printf("result. tmp[%s]\n", tmp);
   free(tmp);
   
   // check errors.
   j_err = json_array();
   json_array_foreach(j_arr, idx, j_tmp)
   {        
       if(j_tmp == NULL)
       {
           printf("Err.\n");
       }
           
       if((idx == 3) || (idx == 5))
       {
           json_array_append(j_err, j_tmp);
       }
   }
   
   json_array_foreach(j_err, idx, j_tmp)
   {
       tmp_value = json_string_value(j_tmp);
       
       ret = get_array_idx(j_arr, tmp_value);
       if(ret == -1)
       {
           continue;
       }
       json_array_remove(j_arr, ret);
   }
   
   tmp = json_dumps(j_arr, JSON_ENCODE_ANY);
   printf("result. tmp[%s]\n", tmp);
   free(tmp);
   
   json_decref(j_arr);
   json_decref(j_err);


   return 0;

} </source>

References

<references />