c语言解析json

17 篇文章 0 订阅
4 篇文章 0 订阅
c语言解析json
一,json简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

空白可以加入到任何符号之间。 

二,json-c库说明
3.1 JSON对象的生成
3.1.1,Json对象的类型:
json_type_object, “名称/值”对的集合
Json对象的值类型
json_type_boolean,
json_type_double, 
json_type_int,
json_type_array, “值”的集合
json_type_string

3.1.2,struct json_object * json_object_new_object();
说明:创建个空的json_type_object类型JSON对象。
struct json_object* json_object_new_boolean(boolean b);
说明:创建个json_type_boolean值类型json对象
boolean json_object_get_boolean(struct json_object *obj);
说明:从json对象中boolean值类型得到boolean值
同样:
struct json_object* json_object_new_int(int i)
int json_object_get_int(struct json_object *this)
struct json_object* json_object_new_double(double d)
double json_object_get_double(struct json_object *this)
struct json_object* json_object_new_string(char *s)
char* json_object_get_string(struct json_object *this)

3.1.3,struct json_object * json_object_new_array();
说明:创建个空的json_type_array类型JSON数组值对象。
struct json_object * json_tokener_parse(char *str);
说明:由str里的JSON字符串生成JSON对象,str是son_object_to_json_string() 生成的。
参数:str – json字符串

3.1.4,struct json_object * json_object_object_get(struct json_object * json,char *name);
说明:从json中按名字取一个对象。
参数:
json – json对象
name -  json域名字

3.2,JSON对象的释放
struct json_object * * json_object_get(struct json_object * this)
说明: 增加对象引用计数。使用c库最关心的是内存谁来分配, 谁来释放. jsonc的内存管理方式, 是基于引用计数的内存树(链), 如果把一个struct json_object 对象a, add到另一个对象b上, 就不用显式的释放(json_object_put) a了, 相当于把a挂到了b的对象树上, 释放b的时候, 就会释放a. 当a即add到b上, 又add到对象c上时会导致a被释放两次(double free), 这时可以增加a的引用计数(调用函数json_object_get(a)), 这时如果先释放b, 后释放c, 当释放b时, 并不会真正的释放a, 而是减少a的引用计数为1, 然后释放c时, 才真正释放a.
参数:
this – json对象


void json_object_put(struct json_object * this)
说明:
减少对象引用次数一次,当减少到0就释放(free)资源
参数:
this – json对象

3.3 JSON对象的操作
int json_object_is_type(struct json_object * this, enum json_type type)
说明:
检查json_object是json的某个类型
参数:
this: json_object 实例
type: json_type_boolean,json_type_double, json_type_int, json_type_object, json_type_array, json_type_string

enum json_type json_object_get_type(struct json_object * this ) 
说明:
得到json_object的类型。
参数:
this – json对象

char * json_object_to_json_string(struct json_object * this)
说明:
将json_object内容转换json格式字符串,其中可能含有转义符。
参数:
this – json对象
返回值:
Json格式字符串

void json_object_object_add(struct json_object* obj, char *key, struct json_object *val);
说明:
添加个对象域到json对象中
参数:
Obj – json对象
key – 域名字
val – json值对象

void json_object_object_del(struct json_object* obj, char *key);
说明:
删除key值json对象
参数:
ob j – json对象
key – 域名字

int json_object_array_length(struct json_object *obj);
说明:
得到json对象数组的长度。
参数:
ob j – json数组值对象

extern int json_object_array_add(struct json_object *obj,
struct json_object *val);
说明:
添加一元素在json对象数组末端
参数:
ob j – json数组值对象
val – json值对象

int json_object_array_put_idx(struct json_object *obj, int idx,
    struct json_object *val);
说明:
在指定的json对象数组下标插入或替换一个json对象元素。
参数:
ob j – json数组值对象
val – json值对象
  idx – 数组下标

struct json_object * json_object_array_get_idx(struct json_object * json_array,int i);
说明:
从数组中,按下标取JSON值对象。
参数:
json_array – json 数组类型对象
i – 数组下标位置

定义宏 json_object_object_foreach(obj,key,val)
说明:
遍历json对象的key和值 (key, val默认参数不变)

extern struct json_object* json_object_from_file(const char *filename);
extern int json_object_to_file(const char *filename, struct json_object *obj);
类似序列化的函数

参考:http://www.json.org/json-zh.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值