C语言:json库使用学习
Json基础
一、Json的概念
Json(Javascript Object Notation)全称为JavaScript对象表示法,是一种轻量级的数据交换格式,采用完全独立于语言的文本格式。JSON 是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。
1、Json的特性
JSON 是纯文本
JSON 具有“自我描述性”(人类可读)
JSON 具有层级结构(值中存在值)
JSON 可通过 JavaScript 进行解析
JSON 数据可使用 AJAX 进行传输
2、与XML的对比
Json与XML很是相似,关于它们的不同,主要例举以下几点:
没有结束标签
更短
读写的速度更快
能够使用内建的 JavaScript eval() 方法进行解析
使用数组
不使用保留字
二、Json的用途
大致与XML相同
三、Json的语法简要说明
1、Json语法规则
(1)、数据在名称/值对中
(2)、数据由逗号分隔
(3)、花括号保存对象
(4)、方括号保存数组
2、JSON 名称/值对与Json值
JSON 数据的书写格式是:名称/值对。
示例:"firstName" : "John"
Json的值可以是数字、字符串、布尔值、数组、对象、空值等等。
3、Json对象
Json对象在花括号中书写,一个对象可以包含多个名称/值对(即多个数据)。
4、Json数组
JSON 数组在方括号中书写:
数组可包含多个对象:
{"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]}
在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。
四、Json的简易使用例子
1、使用json-c库的函数
json_object *my_string;
my_string = json_object_new_string("\t");
g_print("my_string = %s\n",json_object_get_string(my_string));
g_print("my_string.to_string()=%s\n",json_object_to_json_string(my_string));
json_object_put(my_string);//减少引用计数
my_string = json_object_new_string("\\");
g_print("my_string=%s\n", json_object_get_string(my_string));
g_print("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
json_object_put(my_string);
my_string = json_object_new_string("foo");
g_print("my_string=%s\n", json_object_get_string(my_string));
g_print("my_string.to_string()=%s\n",json_object_to_json_string(my_string));
输出结果:
my_string =
my_string.to_string()="\t"
my_string=\
my_string.to_string()="\\"
my_string=foo
my_string.to_string()="foo"
说明:
//Create a new empty json_object of type json_type_xxx
//创建一个xxx类型的空json对象,引用计数加一
extern struct json_object* json_object_new_xxx(xxx s);
//减少obj的引用计数,当计数为0时就释放掉该对象
int json_object_put(struct json_object *obj);
通过json_object_get_string与json_object_to_json_string的输出结果可以比较出前者是提取出字符串值并返回,后者是将字符串以json格式返回。
这两个函数返回的字符串由json_object管理,即my_string被json_object_put减少引用计数至0后字符串内存被释放
json_object *my_array;
my_array = json_object_new_array();
//添加json类型值到数组中
json_object_array_add(my_array,json_object_new_int());
json_object_array_add(my_array,json_object_new_int());
json_object_array_add(my_array,json_object_new_int());
json_object_array_put_idx(my_array,,json_object_new_int());
g_print("my_array=\n");
for(i=;i<json_object_array_length(my_array);i++){
json_object *obj = json_object_array_get_idx(my_array,i);
g_print("\t[%d]=%s\n",i,json_object_to_json_string(obj));
}
g_print("my_array.to_string() = %s\n",json_object_to_json_string(my_array));
输出结果:
my_array=
[0]=1
[1]=2
[2]=3
[3]=null
[4]=5
my_array.to_string() = [ 1, 2, 3, null, 5 ]
说明:
//往值为数组类型的json_object中添加json对象。
extern int json_object_array_add(struct json_object *obj,
struct json_object *val);
//插入或替换在数组中idx索引下的元素,引用计数不会变化
extern int json_object_array_put_idx(struct json_object *obj, int idx,
struct json_object *val);
//得到类型为数组的json_object的长度
extern int json_object_array_length(struct json_object *obj);
//得到数组中索引为idx的元素
extern struct json_object* json_object_array_get_idx(struct json_object *obj,
int idx);
json_object *my_object;
my_object = json_object_new_object();
//添加json名称和值到json对象集合中
json_object_object_add(my_object,"abc",json_object_new_int());
json_object_object_add(my_object,"foo",json_object_new_string("bar"));
json_object_object_add(my_object,"bool0",json_object_new_boolean(FALSE));
json_object_object_add(my_object,"bool1",json_object_new_boolean(TRUE));
json_object_object_add(my_object,"baz",json_object_new_string("bang"));
//同样的key添加会替换掉
json_object_object_add(my_object,"baz",json_object_new_string("fark"));
json_object_object_del(my_object,"baz"); g_print("my_object=\n");
//遍历对象集合
json_object_object_foreach(my_object,key,val){
g_print("\t%s : %s\n",key,json_object_to_json_string(val));
}
g_print("my_object.to_string() = %s\n",json_object_to_json_string(my_object));
输出结果:
my_object=
abc : 12
foo : "bar"
bool0 : false
bool1 : true
my_object.to_string() = { "abc": 12, "foo": "bar", "bool0": false, "bool1": true }
说明:
//添加一个json对象字段到类型为object的obj中去
extern void json_object_object_add(struct json_object* obj, const char *key,
struct json_object *val);
//删除指定的字段,并且被删除的对象的引用计数会被减一
extern void json_object_object_del(struct json_object* obj, const char *key);
2、列出json-c里的一些函数做说明
extern struct json_object* json_object_from_file(const char *filename);
说明:将参数中制定的json文件转换为json对象
extern int json_object_to_file(char *filename, struct json_object *obj);
说明:将json对象写回到文件,并返回状态
extern struct json_tokener* json_tokener_new(void);
说明:
该函数返回一个json_tolener对象并做相应初始化
struct json_tokener //这是json_tokener的结构定义,关于json解析的信息都包含于此,例如状态、错误等信息
{
char *str;
struct printbuf *pb;
int max_depth, depth, is_double, st_pos, char_offset;
enum json_tokener_error err;
unsigned int ucs_char;
char quote_char;
struct json_tokener_srec *stack;
int flags;
};
extern void json_tokener_free(struct json_tokener *tok);
说明: 对tok进行析构,即做一些释放、赋初值等操作。
extern struct json_object* json_tokener_parse(const char *str);
说明: 解析一个字符串并返回一个相应类型的json_object对象,例如传入的字符串为"[\"abc\",null,\"def\",12]",那么便返回一个数组类型的json对象
extern json_bool json_object_object_get_ex(struct json_object* obj,
const char *key,
struct json_object **value);
说明:
通过参数中给定的字段得到相应的json对象,如果找到就返回true,否则返回false,找到的json对象通过value得到该函数与json_object_object_get功能相同,只是json_object_object_get是直接返回json对象。
C语言:json库使用学习的更多相关文章
- JSON的简单介绍以及C语言的JSON库使用
JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- C语言cJSON库的使用,解析json数据格式
C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html 对于c语言来说是没有字典这样的结构的,所以对于解析 ...
- Redis学习之路(008)- Redis C语言客户端库hiredis文档翻译
Hiredis是Redis数据库一个轻量的C语言客户端库. 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能.但正是由于这种设计使我们只要熟悉了通用的r ...
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...
- (数据科学学习手札137)orjson:Python中最好用的json库
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我们在日常使用Pytho ...
- Java常用的几个Json库,性能强势对比!
作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...
- 1. 初识Jackson -- 世界上最好的JSON库
要想人前显贵,必须背后受罪.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...
- 手写Json解析器学习心得
一. 介绍 一周前,老同学阿立给我转了一篇知乎回答,答主说检验一门语言是否掌握的标准是实现一个Json解析器,网易游戏过去的Python入门培训作业之一就是五天时间实现一个Json解析器. 知乎回答- ...
随机推荐
- c#定义一个方法,根据存储过程名称和存储过程参数数组,执行对应的存储过程
定义一个根据存储过程名称和存储过程参数数组,执行对应的存储过程的方法.用SqlParameter[]代替存储过程需要的参数.这样就不用为每一个存储过程写一个方法了 1.首先定义一个ExcuteProc ...
- [转]网上看到的关于C中内存分配的描述
1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始 ...
- C#继承关系中【方发表】的创建和调用
—C#继承关系中[方发表]的创建和调用 Insus.NET实现一个最炫最原创的验证码.你可以从下面的一步一步的演译. 实现一个验证码,需要了解的是,它最基本是随机产生字符串:<在ASP.NET ...
- Effective C++(12) 复制对象时要复制每一个成员
问题聚焦: 负责拷贝的两个操作:拷贝构造函数和重载赋值操作符. 一句话总结,确保被拷贝对象的所有成员变量都做一份拷贝. Demo void logCall(const std::string&am ...
- 工作经常使用的SQL整理
工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战 ...
- 【python】初识python的问题
这两天利用晚上时间简单的了解了一下python语言,在Mac上和Windows上都安装了python,对比两个平台,还是发现在mac上体验比较好一点.安装的版本好像也不一样,语法还有点小区别.简单的对 ...
- ESB与SOA的关系
ESB与SOA的关系 一.SOA和ESB一直是没有明确概念的两个缩略词 SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服 ...
- [转]Converting a C library to gyp
Source:http://n8.io/converting-a-c-library-to-gyp/ Converting a C library to gyp Published: 2012.10. ...
- 开源框架Caliburn.Micro
Caliburn.Micro学习笔记----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeple ...
- MongoDB学习3
MongoDB学习(翻译3) 支持的where字句(比较多,今天先写一部分) 本节介绍支持的where字句 正如前面提到的,不是所有的C#表达式都支持where子句.您可以以此文为指导,或者你可以 ...