【个人总结系列-24】JSON学习总结及CJson代码分析
- 格式:docx
- 大小:22.12 KB
- 文档页数:4
cJSON库源码分析本⽂采⽤以下协议进⾏授权: ,转载请注明作者及出处。
cJSON是⼀个超轻巧,携带⽅便,单⽂件,简单的可以作为ANSI-C标准的Json格式解析库。
那什么是Json格式?这⾥照搬度娘百科的说法:Json(JavaScript Object Notation) 是⼀种轻量级的数据交换格式。
它基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的⼀个⼦集。
JSON采⽤完全独⽴于语⾔的⽂本格式,但是也使⽤了类似于C语⾔家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。
这些特性使JSON成为理想的数据交换语⾔。
易于⼈阅读和编写,同时也易于机器解析和⽣成。
其实简单说,Json就是⼀种信息交换格式,⽽cJSON其实就是对Json格式的字符串进⾏构建和解析的⼀个C语⾔函数库。
可以在以下地址下载到cJSON的源代码:__MACOSX⽬录是提供给Mac OS的源码,我的机器运⾏的是Fedora 18,所以选择另外⼀个⽬录即可。
简单的阅读下README⽂件,先学习cJSON库的使⽤⽅法。
若是连库都还不会使⽤,分析源码就⽆从谈起了。
通过简单的了解,我们得知cJSON库实际上只有cJSON.c和cJSON.h两个⽂件组成,绝对轻量级。
不过,代码风格貌似有点⾮主流,先⽤indent格式化⼀下代码吧。
我个⼈喜欢K&R风格的代码,使⽤的indent命令⾏参数如下:1indent - bad - bli 0 - ce - kr - nsob -- space - after - if -- space - after - while -- space - after - for -- use - tabs - i8格式化之后,代码结构看起来清晰多了。
那么,从何处下⼿来分析呢?打开代码⽂件逐⾏阅读么?当然不是了,有main函数的程序⼤都是从main函数开始分析,那么没有main函数的纯函数库呢?那就⾃⼰写main函数呗。
在C#中,Json的序列化和反序列化的⼏种⽅式总结在这篇⽂章中,我们将会学到如何使⽤C#,来序列化对象成为Json格式的数据,以及如何反序列化Json数据到对象。
⾸先,解释⼀下jsonJson【javascript对象表⽰⽅法】,它是⼀个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和⽣成,它是完全独⽴于语⾔的。
Json⽀持下⾯两种数据结构:键值对的集合--各种不同的编程语⾔,都⽀持这种数据结构;有序的列表类型值的集合--这其中包含数组,集合,⽮量,或者序列,等等。
Json有下⾯⼏种表现形式1.对象⼀个没有顺序的“键/值”,⼀个对象以花括号“{”开始,并以花括号"}"结束,在每⼀个“键”的后⾯,有⼀个冒号,并且使⽤逗号来分隔多个键值对。
例如:1var user = {"name":"Manas","gender":"Male","birthday":"1987-8-8"}2.数组设置值的顺序,⼀个数组以中括号"["开始,并以中括号"]"结束,并且所有的值使⽤逗号分隔,例如:1var userlist = [{"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}},2 {"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}]3.字符串任意数量的Unicode字符,使⽤引号做标记,并使⽤反斜杠来分隔。
c语言中json的用法摘要:1.简介2.JSON 的基本概念3.C 语言中JSON 的解析方法4.C 语言中JSON 的生成方法5.总结正文:1.简介C 语言作为一种广泛应用于系统编程和嵌入式开发的编程语言,对于数据的存储和传输有着严格的要求。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。
在C 语言中使用JSON,可以方便地进行数据的存储和传输。
2.JSON 的基本概念JSON 是一种基于对象的文本格式,它包括键值对(key-value pairs)、数组(arrays)和对象(objects)。
JSON 中的数据都是用引号括起来的字符串,且所有的键和值都必须用引号括起来。
JSON 数据的结构主要包括以下两种:- 键值对:用冒号(:)分隔的键和值,如"key": "value"。
- 数组:用方括号[] 括起来的元素,如["element1", "element2"]。
3.C 语言中JSON 的解析方法在C 语言中,可以使用一些第三方库来解析JSON 数据。
其中比较常用的库有libjson、cJSON 等。
以下是一个使用libjson 解析JSON 数据的示例:```c#include <stdio.h>#include <json.h>int main() {const char *json_str = "{"name":"张三", "age":30, "city":"北京"}";json_object *json_obj = json_parse(json_str);if (json_obj) {const char *name = json_object_get_string(json_obj, "name");int age = json_object_get_int(json_obj, "age");const char *city = json_object_get_string(json_obj, "city");printf("Name: %s", name);printf("Age: %d", age);printf("City: %s", city);json_object_put(json_obj);}return 0;}```4.C 语言中JSON 的生成方法在C 语言中,可以使用一些第三方库来生成JSON 数据。
C++使⽤cjson操作Json格式⽂件(创建、插⼊、解析、修改、删除)⽬录为什么要学习解析Json⽂件?⼀、准备cJSON开源库⼆、cJSON介绍三、封装Json四、解析Json五、修改Json六、删除Json七、全部代码⼋、总结为什么要学习解析Json⽂件?⼯作需要呗!最近在⼯作项⽬中,有需求是需要进⾏解析Json字符串的,但是我只会使⽤QT去解析Json,且主管规定要使⽤C/C++语⾔去解析,说是为了⽅便移植到其他项⽬中进⾏使⽤…没办法,只能硬着头⽪,在⽹上找找有没有什么解析Json的开源库是C/C++可以使⽤的。
找了许多,⽹上也提供了许多,最终我选择了cJOSN,不为什么,就是因为它⼩巧玲珑,且是纯C的!花了⼀两周的悠闲时间去学习,把⼀些⽐较常⽤的解析的JSON字符串解析解析记录下来!最后简单介绍⼀下json是什么吧:json是⼀个轻量级的数据存储交换语⾔,其是通过键值对的形式存储的,例如:{ “key” : “value” }注意:键需要使⽤双引号括起来,值如果是字符串也需要使⽤双引号括起来,其他类型不需要。
json主要⽤来⽹络数据传输!⼀、准备cJSON开源库下载后会得到⼀个压缩包,解压后进⼊⾥⾯拷贝cJSON.c和cJSON.h⽂件到⾃⼰的项⽬中去。
最后在⾃⼰的项⽬中把这两个⽂件添加进来即可!Linux 和 Window下都可以使⽤!⼆、cJSON介绍⾸先介绍⼀下json数据:上图的json数据就是这篇博客将要操作的,将会对其进⾏创建、解析、修改、删除操作。
其中这⾥包含项⽬中常⽤的封装和解析。
cJSON主要是通过结构体cJSON进⾏存储数据:typedef struct cJSON {struct cJSON *next,*prev; /* next是获取下⼀个元素数据,prev是获取前⼀个元素数据 */struct cJSON *child; /* 获取第⼀个元素数据,当需要获取下⼀个时,就得使⽤next了. */int type; /* 当前的json类型对象、数组、字符串、数字、null、true、false等 */char *valuestring; /* 字符串值, if type==cJSON_String */int valueint; /* 整形类型值, if type==cJSON_Number */double valuedouble; /* 浮点数类型值, if type==cJSON_Number */char *string; /* 这个是键 */} cJSON;type类型,与下⾯的宏进⾏判断/* cJSON Types: */#define cJSON_False 0 // true#define cJSON_True 1 // false#define cJSON_NULL 2 // NULL#define cJSON_Number 3 // 数字#define cJSON_String 4 // 字符串#define cJSON_Array 5 // 数组#define cJSON_Object 6 // 对象字符串⽣成cjson指针的函数,使⽤后需要调⽤cJSON_Delete进⾏释放extern cJSON *cJSON_Parse(const char *value);// 释放cJSON_Parse返回的指针extern void cJSON_Delete(cJSON *c);cjson指针指针⽣成字符串的函数// 这个⽣成的字符串有做格式调整extern char *cJSON_Print(cJSON *item);// 这个没有作格式调整,就是⼀⾏字符串显⽰extern char *cJSON_PrintUnformatted(cJSON *item);使⽤这个两个函数⼀定⼀定⼀定要释放它们返回的指针内存,否则会造成内存泄漏。
c语言中 json的用法JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易于人们阅读和编写的方式来表达结构化数据。
在C语言中,使用JSON可以方便地对数据进行序列化和反序列化。
C语言中,可以使用第三方库来处理JSON数据,如 cJSON、Jansson、json-c 等。
这些库提供了一系列函数和结构体,帮助我们在C语言中解析JSON数据并进行相关操作。
下面是一个简单的例子,展示了如何使用 cJSON 库解析和生成JSON数据:```c#include <stdio.h>#include <stdlib.h>#include <cJSON.h>int main() {// 解析JSON数据const char* json_data ="{\"name\":\"Alice\",\"age\":20,\"married\":false}";cJSON* root = cJSON_Parse(json_data);if (root == NULL) {printf("Error: Failed to parse JSON data.\n");return 1;}// 获取字段的值cJSON* name = cJSON_GetObjectItem(root, "name");if (name != NULL) {printf("Name: %s\n", name->valuestring);}cJSON* age = cJSON_GetObjectItem(root, "age");if (age != NULL) {printf("Age: %d\n", age->valueint);}cJSON* married = cJSON_GetObjectItem(root, "married");if (married != NULL) {printf("Married: %s\n", married->type == cJSON_True ? "true" : "false");}// 生成JSON数据cJSON* new_json = cJSON_CreateObject();cJSON_AddStringToObject(new_json, "company", "ABC");cJSON_AddNumberToObject(new_json, "employees", 1000);cJSON_AddBoolToObject(new_json, "public", true);char* new_json_data = cJSON_PrintUnformatted(new_json);printf("Generated JSON data: %s\n", new_json_data);// 释放内存cJSON_Delete(root);cJSON_Delete(new_json);free(new_json_data);return 0;}```在上述代码中,我们首先使用 cJSON_Parse 函数将 JSON 字符串解析为一个 cJSON 对象,然后使用 cJSON_GetObjectItem 函数从中获取所需的字段的值。
cjson用法cjson是一个轻量级的JSON库,用于处理JSON格式的数据。
JSON是一种轻量级的数据交换格式,它使得数据的传输变得更加简洁、易读、易解析,被广泛应用于Web API等数据交互场景。
cjson提供了一系列API,可以将JSON字符串解析为内部数据结构,或者将内部数据结构序列化为JSON字符串。
cjson的使用非常简单,只需要包含cjson.h头文件即可。
下面介绍一些常用的API。
一、将JSON字符串解析为内部数据结构cJSON\_Parse函数将JSON字符串解析为内部数据结构,如下所示:ccJSON *cJSON\_Parse(const char *value);value参数是一个JSON字符串,解析成功后会返回内部数据结构的指针。
如果解析失败,返回NULL。
例如,我们有一个JSON字符串:json{"name":"Tom","age":18}可以使用以下代码将其解析为内部数据结构:cconst char *json = "{\"name\":\"Tom\",\"age\":18}";cJSON *root = cJSON_Parse(json);if (root != NULL) {printf("name:%s, age:%d\n", cJSON_GetObjectItem(root, "name")->valuestring,cJSON_GetObjectItem(root, "age")->valueint);cJSON_Delete(root);}cJSON\_GetObjectItem函数用于获取JSON对象中的属性值,其中第一个参数是对象的指针,第二个参数是属性名。
Json和序列化总结⼀、序⾔遇到问题,就经常逛园,不知你是否曾有,曾经遇到的问题,或者在园⼦⾥看到问题的⽅案,过⼀段时间,有可能还会摔跤,哈哈...⼤神请勿喷,⼩弟记忆不太好,还过来找资料,如果⾃⼰写把问题或某个知识点总结,问题会更深刻,⾃⼰写的东西更能熟悉的了解。
看别⼈写的⽂章,那是相当的羡慕,可能因为不敢写,懒惰等等个⼈原因,⼀直处于跑步机上停留,从没前进⼀⼤步,⼀直只是想写阶段。
今天尝试改变⼀点点过去的⾃⼰,从部分知识的梳理总结,在梳理过程中如果出现不对,错误的地⽅,还请⼤神多多指出.......废话少说,第⼀天的主题:Json和序列化⼆、json 和序列化⾸先我们先对json和序列化初步了解,之前⾯试⾯试官也问过相关的问题,什么是json,⼏种展现⽅式,你通常⽤序列化⼯具是什么,它有什么优势,下⾯通过简单的⼀个画图,说明json和序列化的认识和介绍:三、代码实例我们很多时候会涉及到⼏个序列化对象的使⽤:DataContractJsonSerializer,JavaScriptSerializer 和 (Newtonsoft)。
少废话,上代码,下⾯就⼀个个登场:第⼀个主⾓:JavaScriptSerializer(1)⾸先我们添加先添加引⽤ System.Web.Extensions备注: JavaScriptSerializer类应⽤ 使⽤序列化和反序列化,为启动Ajax的应⽤程序提供序列化和反序列化命名空间:程序集: System.Web.Extensions(位于 System.Web.Extensions.dll)代码实例static void Main(string[] args){List<User> userList = new List<User>() {new User { Name="帅哥",Age=13,Gender="男"},new User { Name="美⼥",Age=13,Gender="⼥"}};// JavaScriptSerializer序列化var javaScrittLizer = new JavaScriptSerializer().Serialize(userList);Console.WriteLine("序列化:"+javaScrittLizer);// JavaScriptSerializer反序列化string strJson = "{\"Name\":\"张三\",\"Age\":28,\"Gender\":\"⼥\"}";var deserialize = new JavaScriptSerializer().Deserialize<User>(strJson);Console.WriteLine("反序列化:姓名:"+ +"年龄:"+deserialize.Age);Console.ReadKey();}public class User{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }}结果:第⼆个主⾓:(1)第⼀步先在Negut添加安装包(2)添加2.添加Newtonsoft.Json 和 Newtonsoft.Json.Linq 引⽤(3)Newtonsoft.Json我们主要使⽤三个⽅法,基本就能满⾜我们⽇常开发:序列化:SerializeObject(),反序列化:DeserializeObject()还有⼀个可能没有对应的实体类型(或者说不想添加对应的实体类),这时候可以⽤匿名对象解析⽅法DeserializeAnonymousType(),⽅便快捷,对应代码如下:(4)总结:Newtonsoft.Json采⽤了Emit缓存优化,运⾏效率⽐较接近于fastCSharp⽣成的⼿⼯代码效率了,真的很不错,后⾯我们测试数据展⽰给你⼤家,// 1.先从NuGet中添加// 2.添加Newtonsoft.Json 和 Newtonsoft.Json.Linq 引⽤static void Main(string[] args){List<User> userList = new List<User>() {new User { Name="帅哥",Age=13,Gender="男"},new User { Name="美⼥",Age=13,Gender="⼥"}};//序列化var userserializer = JsonConvert.SerializeObject(userList);Console.WriteLine("序列化:"+ userserializer);//反序列化string strJson = "{\"Name\":\"张三\",\"Age\":28,\"Gender\":\"⼥\"}";User user = JsonConvert.DeserializeObject<User>(strJson);Console.WriteLine("反序列化:姓名:{0},年龄:{1},性别:{2}", , user.Age, user.Gender);//匿名反序列化//可能没有对应的实体类型(或者说不想添加对应的实体类),这时候可以⽤匿名对象解析⽅法DeserializeAnonymousType(),⽅便快捷,对应代码如下:var tempEntity = new { Name = "0", Gender = string.Empty };tempEntity = JsonConvert.DeserializeAnonymousType("{\"Name\":\"帅哥\",\"Gender\":\"男\"}", tempEntity);Console.WriteLine("匿名序列化:姓名:" + + ",性别:" + tempEntity.Gender);Console.ReadKey();}public class User{public string Name { get; set; }public int Age { get; set; }public string Gender { get; set; }}效果显⽰:第三个主⾓:DataContractJsonSerializer(1)⽼规矩,需要添加引⽤:System.ServiceModel.Web 和 System.Runtime.Serialization(2)程序员就要⼲脆点,直接上代码:做DataContractJsonSerializer demo测试的时候出现⼩插曲:(1)反序列化的时候,敲代码不⼩⼼ Deault 采⽤ANSI编码,不会编译报错,但是没有显⽰反序列化结果,⼤家⼩⼼,因为这⾥是UTF8 编码(2)User类中如果不加 [Serializable] [DataContract] 这属性,会直接报错,为啥报错,我也百度了相关资料,代码中已经做出解释,如果不加还会显⽰这样的字符串:<Name>k_BackingField⼤家可以去试试,为啥出现,代码和下⾯总结中会给出答案。
C语⾔cJSON库的使⽤,解析json数据格式 对于c语⾔来说是没有字典这样的结构的,所以对于解析json格式的数据来说不是那么好解析,但是有些时候⼜会需要处理这样的数据格式,这⾥就有⼀个解析json的函数库可以给我们使⽤了。
这个函数库就是cJSON了。
这⾥提供了下载资源可以下载后直接⽤。
https:///files/piaoyang/cJSONFiles.rar ⾃⼰使⽤时可以只需要其中的cJSON.c和cJSON.h⽂件就可以了,只需要将cJSON和⾃⼰的main⽂件⼀起编译即可。
主要函数接⼝介绍: 这⾥有个很重要的结构体是需要⽤到的就是cJSON 结构体如下:typedef struct cJSON { struct cJSON *next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/ struct cJSON *child; /*数组或对象的孩⼦节点*/ int type; /* key的类型*/ char *valuestring; /*字符串值*/ int valueint; /* 整数值*/ double valuedouble; /* 浮点数值*/ char *string; /* key的名字*/} cJSON;说明:1、cJSON是使⽤链表来存储数据的,其访问⽅式很像⼀颗树。
每⼀个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩⼦节点,通过child指针来访问,进⼊下⼀层。
只有节点是对象或数组时才可以有孩⼦节点。
2、type是键(key)的类型,⼀共有7种取值,分别是:False,Ture,NULL,Number,String,Array,Object。
若是Number类型,则valueint或valuedouble中存储着值。
若期望的是int,则访问valueint,若期望的是double,则访问valuedouble,可以得到值。
c++ cjson解析首先,我们来解释一下“c++ cjson解析”这个概念。
1.c++: C++ 是一种编程语言,它是C 语言的扩展,由Bjarne Stroustrup在 1983 年创建。
C++ 保持了 C 语言的效率,并且添加了面向对象编程的特性。
2.cjson: “cJSON”是一个在C/C++ 中用于处理JSON 的库。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和写入,并使用人类可读的文本来描述结构化数据。
当“c++”和“cjson解析”放在一起时,意味着我们正在讨论如何使用C++ 和 cJSON 库来解析 JSON 数据。
c++ cjson解析包括的内容:●安装和配置 cJSON: 首先,你需要安装 cJSON 库并将其配置到你的 C++项目中。
●基本用法: 使用 cJSON 库来解析 JSON 数据的基本方法。
例如,如何从一个 JSON 字符串中提取数据。
●错误处理: 学习如何处理可能发生的任何解析错误。
●高级功能: 可能包括更复杂的功能,如动态修改JSON 数据或处理大型JSON 文件。
分条罗列:1.安装和配置 cJSON:o从官方网站或源代码下载 cJSON。
o解压并编译。
o将编译的库文件链接到你的 C++ 项目中。
2.基本用法:o使用cJSON_Parse来解析 JSON 字符串。
o使用cJSON_GetObjectItem或其他相关函数来访问 JSON 数据。
3.错误处理:o使用cJSON_GetErrorPtr来获取有关错误的更多信息。
o在解析过程中检查错误代码。
4.高级功能:o使用cJSON_CreateObject和cJSON_AddToObject来动态创建和修改 JSON 数据。
o处理大型 JSON 文件时使用适当的内存管理方法。
5.其他: 可以查找和使用第三方库或工具来增强对 JSON 的支持,例如用于格式化输出的库或用于更高效解析的库。
c语言中json格式工具JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于在客户端和服务器之间传输数据。
在C语言中,可以使用各种工具来处理JSON格式的数据。
本文将介绍几种常见的C语言JSON格式工具及其使用方法。
一、JSON-CJSON-C是一款C语言中常用的JSON解析器和生成器。
它提供了灵活的接口,可以很方便地解析和生成JSON格式的数据。
1. 解析JSON为了解析JSON格式的数据,首先需要将JSON格式的字符串转换为JSON对象。
可以使用以下代码进行解析:```c#include <stdio.h>#include <json-c/json.h>int main() {const char *json_str = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";json_object *json = json_tokener_parse(json_str);json_object *name, *age, *city;json_object_object_get_ex(json, "name", &name);json_object_object_get_ex(json, "age", &age);json_object_object_get_ex(json, "city", &city);printf("Name: %s\n", json_object_get_string(name));printf("Age: %d\n", json_object_get_int(age));printf("City: %s\n", json_object_get_string(city));json_object_put(json);return 0;}```在上述代码中,我们首先定义一个JSON格式的字符串`json_str`。
JSON学子总结及CJson代码分析
“JSON”的全称是“JavaScript Object Notation”,即JavaScript对象符号,是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。
JSON 采用与编程语言无关的文本格式,但是也使用了类C语言(包括C、C++、C#、Java、JavaScript、Python等)的习惯,这些特性使JSON成为理想的数据交换格式。
JSON建构于两种结构:
(1)“名称/值”对的集合。
不同的语言中,其被理解为对象(“object”)、纪录(“record”)、结构(“struct”)、字典(“dictionary”)、哈希表(“hash table”)、有键列表(“keyed list”)或者关联数组(“associative array”)。
(2)值的有序列表。
在大部分语言中,其被理解为数组(“array”)。
简单理解,JSON的定义由以下四句话就全部定义了。
●并列的数据之间用逗号(”,”)分隔。
●映射用冒号(”:”)表示。
●并列数据的集合(数组)用方括号("[]")表示。
●映射的集合(对象)用大括号(”{}”)表示。
对JSON的解析
主要学习了通过一个简短的开源的C语言代码cJson对JSON格式数据进行解析。
cJson的代码很简短,全部只有20KB左右,主要包含了解析、构造、编辑JSON 数据,这些功能主要通过其自定义的cJSON数据结构。
cJSON数据结构对JSON 格式数据进行了描述,并通过程序提供了许多操作,cJSON数据结构定义如下所示:
Json对象的类型
以下通过下面的JSON格式数据为例分析cJson中的基本函数,数据在C语言中表示如下:
char* value = "[{\"name\":\"鸟巢\",\"point\":{\"lat\":\"39.990\",\"lng\":\"116.397\"},\"desc\":\"奥运会主场地\"},{\"name\":\"北大乒乓球馆\",\"point\":{\"lat\":\"39.988\",\"lng\":\"116.315\"},\"desc\":\"乒乓球比赛场地\"},{\"name\":\"北京工人体育场\",\"point\":{\"lat\":\"39.930\",\"lng\":\"116.446\"},\"desc\":\"足球比赛场地\"}]"
[{
"name": "鸟巢",
"point": {
"lat": "39.990",
"lng": "116.397"
},
"desc": "奥运会主场地"
}, {
"name": "北大乒乓球馆",
"point": {
"lat": "39.988",
"lng": "116.315"
},
"desc": "乒乓球比赛场地"
}, {
"name": "北京工人体育场",
"point": {
"lat": "39.930",
"lng": "116.446"
},
"desc": "足球比赛场地"
}]。