C语言:json库使用学习

时间:2022-08-28 00:22:32

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库使用学习的更多相关文章

  1. JSON的简单介绍以及C语言的JSON库使用

    JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采 ...

  2. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  3. C语言cJSON库的使用,解析json数据格式

    C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html 对于c语言来说是没有字典这样的结构的,所以对于解析 ...

  4. Redis学习之路(008)- Redis C语言客户端库hiredis文档翻译

    Hiredis是Redis数据库一个轻量的C语言客户端库. 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能.但正是由于这种设计使我们只要熟悉了通用的r ...

  5. Json学习总结(2)——Java 下的 JSON库性能比较:JSON&period;simple vs&period; GSON vs&period; Jackson vs&period; JSONP

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  6. Java常用的几个Json库,性能强势对比!

    作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...

  7. 1&period; 初识Jackson -- 世界上最好的JSON库

    要想人前显贵,必须背后受罪.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.MyBatis.中 ...

  8. 手写Json解析器学习心得

    一. 介绍 一周前,老同学阿立给我转了一篇知乎回答,答主说检验一门语言是否掌握的标准是实现一个Json解析器,网易游戏过去的Python入门培训作业之一就是五天时间实现一个Json解析器. 知乎回答- ...

  9. json深度详解及org&period;json库

    了解json  (Javascript Object Notation) 网站:http://json.org/ english JSON (JavaScript Object Notation) i ...

随机推荐

  1. PHP &quot&semi;延迟静态绑定&quot&semi; 功能,static

    从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法.第二点延迟绑定,这个根据下面代码就可以很好的理解 看一下这个例子: class A{ static $name ...

  2. SQL Server2014&comma;附加数据库失败&comma;错误为&colon;5120的解决方法

    在SQL Server 2014附加数据库的时候,报错为: 无法打开物理文件XXX,操作系统错误5(拒绝访问),SQL Server 错误5120 解决方法:  我的电脑→管理→服务和应用程序→ 服务 ...

  3. try catch finally的执行顺序(有return的情况下)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  4. MyEclipse取消自动跳到Console窗口

    在Myeclipse中当全屏查看其它文件时,如果控制台有东西输出,就会弹出控制台窗口,如何取消? 方法1: -->右键在console窗口中点Preferences, -->将Show w ...

  5. 门户网站架构Nginx&plus;Apache&plus;MySQL&plus;PHP&plus;Memcached&plus;Squid

    服务器的大用户量的承载方案 一.前言二.编译安装三. 安装MySQL.memcache四. 安装Apache.PHP.eAccelerator.php-memcache五. 安装Squid六.后记 一 ...

  6. Python 第九篇:队列Queue、生产者消费者模型、&lpar;IO&sol;异步IP&sol;Select&sol;Poll&sol;Epool&rpar;、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

  7. x86&sol;x64&sol;x86&lowbar;64&sol;i386&sol;ia32&sol;ia64&sol;amd&sol;amd64 辨析

    x64 = x86_64 = amd64 64位指令集,是对IA-32的扩展,由AMD提出,implemented by AMD,Intel.可兼容32位指令集(IA-32) 目前大部分64位计算机均 ...

  8. flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?

    在测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用,配置如下: a1.sinks.k1.type=hdfs a1.sinks.k1.channel=c1 a1.sinks.k1.h ...

  9. bind,unbind,one

    刚开始我们先看一下它的定义: .bind( eventType [, eventData], handler(eventObject)) .Bind()方法的主要功能是在向它绑定的对象上面提供一些事件 ...

  10. NumPy 基础用法

    NumPy 是高性能科学计算和数据分析的基础包. 它是 pandas 等其他各种工具的基础. 主要功能: ndarray 一个多维数组结构, 高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...