json作为通信报文

来源:互联网 发布:淘宝破损补寄显示什么 编辑:程序博客网 时间:2024/05/22 14:09

通常报文格式一般分为两种,一种是报文类型标识,长度,校验。还有一种是报文类型标识,结束标识,校验。

第一种有利于接收方进行报文解析,应为首先能知道将要接收的报文长度。但是第一类报文的扩展性,灵活性和嵌套性比较差,类似tcpip协议头等传统协议。

第二种报文对于接收方来说比较不好处理,需要不停的判断结束符和校验,但是报文灵活,可以随意嵌套,类似于json和xml语言。


json或者xml其实质是不同类型的对象组成的多叉树,在c语言用的链表数据结构构建。

json new创建的要手动put,put会递归的put一遍子树,get的要手动put,因为会增加引用计数。


json_object_object_add会先删除同key的元素,再添加key的元素。

json_c库的一些对象:


struct json_object
{
  enum json_type o_type;  //类型
  json_object_delete_fn *_delete; //释放函数
  json_object_to_json_string_fn *_to_json_string; //json转str函数
  int _ref_count; //引用计数
  struct printbuf *_pb; // 打印buf
  union data {   //真正的数据 联合体
    boolean c_boolean; //bool型
    double c_double;  //double 型
    int64_t c_int64; //int64型
    struct lh_table *c_object; //object 型
    struct array_list *c_array; //list 型
    struct {  //string型
        char *str;
        int len;
    } c_string;
  } o;
};


//链式结构
struct lh_table {
/**
* Size of our hash.
*/
unsigned char size;
/**
* Numbers of entries.
*/
unsigned char count;

/**
* The first entry.
*/
struct lh_entry *head;

/**
* The last entry.
*/
struct lh_entry *tail;

struct lh_entry *table;

/**
* A pointer onto the function responsible for freeing an entry.
*/
lh_entry_free_fn *free_fn;
lh_hash_fn *hash_fn;
lh_equal_fn *equal_fn;
};


双向链表
struct lh_entry {
/**
* The key.
*/
void *k;
/**
* The value.
*/
const void *v;
/**
* The next entry
*/
struct lh_entry *next;
/**
* The previous entry.
*/
struct lh_entry *prev;
};