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库的函数

 1      json_object *my_string;
 2
 3      my_string = json_object_new_string("\t");
 4      g_print("my_string = %s\n",json_object_get_string(my_string));
 5      g_print("my_string.to_string()=%s\n",json_object_to_json_string(my_string));
 6      json_object_put(my_string);//减少引用计数
 7
 8      my_string = json_object_new_string("\\");
 9      g_print("my_string=%s\n", json_object_get_string(my_string));
10      g_print("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
11      json_object_put(my_string);
12
13      my_string = json_object_new_string("foo");
14      g_print("my_string=%s\n", json_object_get_string(my_string));
15      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=foomy_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后字符串内存被释放

 1      json_object *my_array;
 2      my_array = json_object_new_array();
 3      //添加json类型值到数组中
 4      json_object_array_add(my_array,json_object_new_int(1));
 5      json_object_array_add(my_array,json_object_new_int(2));
 6      json_object_array_add(my_array,json_object_new_int(3));
 7      json_object_array_put_idx(my_array,4,json_object_new_int(5));
 8      g_print("my_array=\n");
 9      for(i=0;i<json_object_array_length(my_array);i++){
10          json_object *obj = json_object_array_get_idx(my_array,i);
11          g_print("\t[%d]=%s\n",i,json_object_to_json_string(obj));
12      }
13      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]=5my_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);

 1      json_object *my_object;
 2      my_object = json_object_new_object();
 3      //添加json名称和值到json对象集合中
 4      json_object_object_add(my_object,"abc",json_object_new_int(12));
 5      json_object_object_add(my_object,"foo",json_object_new_string("bar"));
 6      json_object_object_add(my_object,"bool0",json_object_new_boolean(FALSE));
 7      json_object_object_add(my_object,"bool1",json_object_new_boolean(TRUE));
 8      json_object_object_add(my_object,"baz",json_object_new_string("bang"));
 9      //同样的key添加会替换掉
10      json_object_object_add(my_object,"baz",json_object_new_string("fark"));
11      json_object_object_del(my_object,"baz");
12
13      g_print("my_object=\n");
14      //遍历对象集合
15      json_object_object_foreach(my_object,key,val){
16          g_print("\t%s    :    %s\n",key,json_object_to_json_string(val));
17      }
18      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);

    

  

   

  

时间: 2024-10-05 21:02:20

C语言:json库的使用的相关文章

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

JSON概述 JSON: JavaScript 对象表示法( JavaScript Object Notation) .是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式, 但是也使用了类似于C语言家族的习惯( 包括C. C++. C#. Java. JavaScript. Perl. Python等) .这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写, 同时也易于机器解析和生成(一般用于提升网络传输速率). JSON 解析器

Json 在线格式化与定义、各语言开源库集锦

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. http://www.json.org/json-zh.html 该链接是目前使用过的最好用的在线格式化.格式校验和结构化 JSON 工具. 很多

高性能JSON库---FastJson(阿里巴巴)

1.FastJSON简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种"假定有序快速匹配"的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库. 下载  你可以从以下地址中下载fastjson: Maven中央仓库 http://repo1.maven.org/maven2/com/alibaba/fastjson/ Alibaba OpenSesame开源平台 http://code.alibabatech.com/m

.NET平台开源JSON库LitJSON的使用方法

LitJson.dll下载 一个简单示例: String str = "{'name':'cyf','id':10,'items':[{'itemid':1001,'itemname':'hello'},{'itemid':1002,'itemname':'hello2'}]}"; //*** 读取JSON字符串中的数据 ******************************* JsonData jd = JsonMapper.ToObject(str); String name

程序设计语言-标准库概述

1 认识标准库 没有任何一个重要程序只用某种赤裸裸的程序设计语言写出的:首先总要开发出一组支持库,这也形成了进一步工作的基础. 2 第一个程序 #include<iostream>  //指编译器包含位于iostream里的标准流I/O功能的声明 int main() //定义一个main()函数,该函数没有参数,也不做任何事情 { std::cout<<"hello,world!\n"; //字符串文字量"hello,world!\n"将被

YxdJSON - Delphi 高性能 JSON 库(支持RTTI和序列化操作)

Delphi 高性能 JSON 库(支持RTTI和序列化操作) 支持平台: Windows, Android, iOS, Mac OS https://github.com/yangyxd/YxdJson

【转】Unity上同时兼容Android和IOS的JSON库

转自卡神博客Unity上同时兼容Android和IOS的JSON库 虽然说JSON解析很常见,而且也经常看见大家讨论怎么解析.但是还是很多人经常出现各种问题.这篇文章就一次性帮你解决JSON解析的问题. 本篇文章使用JSON解析在真实项目中使用,同时兼容PC.android和IOS.没啥好说,一个C#写的解析JSON的工具类,在unity中能正常解析. 不太好用的JSON解析库:LitJson在IOS上不稳定,有时正常,有时不正常..MiniJson据说支持不完整,没测试. 本文给出的JSON解

Standard C 语言标准函数库介绍

全面巩固所知所学,往精通方向迈进! Standard C 语言标准函数库速查 (Cheat Sheet) from:http://ganquan.info/standard-c/function/ C语言标准头 <assert.h> 断言 <ctype.h> 字符类测试 <errno.h> (部分)库函数抛出的错误代码 <float.h> 浮点数运算 <limits.h> 检测整型数据类型值范围 <locale.h> 本土化 <

关于使用json库成的内存泄露问题

上篇博文"将传入结构体 pMtInfo 中包含的数据内容转换成 JSON 字符串返回"的代码虽然运行结果正确,但是造成了严重的内存泄露,上篇博文链接如下:http://my.oschina.net/BambooLi/blog/514946 用Linux内存泄露工具valgrind进行内存检查 valgrind介绍 Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访

Java Json库的选取准则

为公司做了小任务,需要用到Java Json库,Json库我几个月之前就用过,不过那时候是跟着项目来的,延续了项目的使用习惯直接用了jackson Json,而这次我觉得好好比较一下几个常见的Json库,然后选一个最快的. 看了几篇blog,觉得其实可选的就三种,jackson, gson, json.simple.我最初用了json.simple,然后写出来了这样的函数 从URL中读取Json数据,并且在Request中添加身份信息 public static JSONObject readJ