C语言:json库的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=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后字符串内存被释放

 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]=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);

 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);

    

  

   

 

  

 




























以上是关于C语言:json库的使用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pygments 检测代码片段的编程语言

静态函数库的制作和使用

C语言代码片段

求C语言标准函数库的源代码

C语言静态库动态库的封装和注意事项

源码分析cJSON库学习