ANSI C中的超轻量级JSON解析器

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式。人类易于阅读和书写。机器很容易解析和生成。它基于JavaScript编程语言标准ECMA-262第三版(1999年12月)的子集 。JSON是一种完全独立于语言的文本格式,但是使用C语言家族(包括C,C ++,C#,Java,JavaScript,Perl,Python等)的程序员熟悉的约定。这些属性使JSON成为理想的数据交换语言。

cJSON旨在成为您可以完成工作的最简单的解析器。它是资源只有一个C的头文件和C文件,所以方便移植。它可以为你各种需要的json字符串处理,包括打包、解析、修改、删除、添加等。在这里将一探究竟。

在这里将着重叙述json的打包和解析,更多处理玩法,见文章末尾链接。

开始cJSON

cJSON合并到您的项目

因为整个库只有一个C文件和一个头文件,所以您只需复制cJSON.h并复制cJSON.c到项目源并开始使用它。

cJSON用ANSI C(C89)编写,以便支持尽可能多的平台和编译器。

下载:

https://github.com/DaveGamble/cJSON/releases

Cjson结构体

  1. /* The cJSON structure: */
  2. typedef struct cJSON
  3. {
  4. struct cJSON *next;
  5. struct cJSON *prev;
  6. struct cJSON *child;
  7. int type;
  8. char *valuestring;
  9. int valueint;
  10. double valuedouble;
  11. char *string;
  12. } cJSON;

结构体项解析:

next 和prev :Cjson结构体作为一个双向连表的环,可以通过 next 和prev 指针进行连表遍历

child:可以是cJSON_Array、cJSON_Object类型数据

type:当前项的类型

valuestring:内容存储,当类型是cJSON_String和cJSON_Raw

valueint:内容存储,整型,可以是cJSON_False、cJSON_True数据

valuedouble:内容存储,浮点型,当类型是cJSON_Number

string:键名

数据类型

l  cJSON_Invalid表示一个不包含任何值的无效项目。如果将项目设置为全零字节,则将自动具有此类型。

l  cJSON_False表示一个false布尔值。您也可以使用来检查布尔值cJSON_IsBool

l  cJSON_True表示一个true布尔值。您也可以使用来检查布尔值cJSON_IsBool

l  cJSON_NULL表示一个null值

l  cJSON_Number 表示一个数字值。该值存储为double in valuedouble和in valueint。如果数字超出整数范围,INT_MAX或INT_MIN用于valueint

l  cJSON_String表示一个字符串值。它以零终止字符串的形式存储在中valuestring

l  cJSON_Array表示一个数组值。这是通过指向表示数组中值child的cJSON项目的链接列表来实现的。使用next和将元素链接在一起prev,其中第一个元素具有prev.next == NULL和最后一个元素next == NULL

l  cJSON_Object 表示一个对象值。对象的存储方式与数组相同,唯一的区别是对象中的项将其键存储在中string

l  cJSON_Raw表示以JSON字符存储的零终止形式的任何JSON valuestring。例如,可以使用它来避免一遍又一遍地打印相同的静态JSON以节省性能。解析时,cJSON永远不会创建此类型。另请注意,cJSON不会检查其是否为有效JSON。

类型

  1. #define cJSON_Invalid (0)
  2. #define cJSON_False (1 << 0)
  3. #define cJSON_True (1 << 1)
  4. #define cJSON_NULL (1 << 2)
  5. #define cJSON_Number (1 << 3)
  6. #define cJSON_String (1 << 4)
  7. #define cJSON_Array (1 << 5)
  8. #define cJSON_Object (1 << 6)
  9. #define cJSON_Raw (1 << 7) /* raw json */

类型判断

  1. cJSON_IsInvalid(const cJSON * const item);
  2. cJSON_IsFalse(const cJSON * const item);
  3. cJSON_IsTrue(const cJSON * const item);
  4. cJSON_IsBool(const cJSON * const item);
  5. cJSON_IsNull(const cJSON * const item);
  6. cJSON_IsNumber(const cJSON * const item);
  7. cJSON_IsString(const cJSON * const item);
  8. cJSON_IsArray(const cJSON * const item);
  9. cJSON_IsObject(const cJSON * const item);
  10. cJSON_IsRaw(const cJSON * const item);

注意

创建cjson对象后,处理完需要进行内存释放:

如果是cjson里的对象,请使用cJSON_Delete()

如果不是对象:cJSON_free()或free()

零字符

cJSON不支持包含零字符'\0'或的字符串\u0000。对于当前的API,这是不可能的,因为字符串以零结尾。

字符编码

cJSON仅支持UTF-8编码的输入。但是在大多数情况下,它不会拒绝无效的UTF-8作为输入,而只是将其原样传播。只要输入不包含无效的UTF-8,输出将始终是有效的UTF-8。

C标准

cJSON用ANSI C(或C89,C90)编写。如果您的编译器或C库未遵循此标准,则不能保证正确的行为。

注意:ANSI C不是C ++,因此不应使用C ++编译器进行编译。您可以使用C编译器对其进行编译,然后将其与C ++代码链接。尽管可以使用C ++编译器进行编译,但是不能保证正确的行为。

浮点数字

double除IEEE754双精度浮点数外,cJSON不正式支持任何实现。它可能仍然可以与其他实现一起使用,但是这些实现的错误将被视为无效。

目前,cJSON支持的浮点文字的最大长度为63个字符。

数组和对象的深层嵌套

cJSON不支持嵌套太深的数组和对象,因为这会导致堆栈溢出。为了防止这种CJSON_NESTING_LIMIT情况,默认情况下,cJSON将深度限制为1000,但是可以在编译时进行更改。

格式化输出

按标准的格式输出json字符串,输出完后一定要记得释放内存

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. //待解析字符串
  6. char *json_str="{\"key1\":\"dongxiaodong\",\"key2\":1998,\"key3\":55778}";
  7.  
  8. //输出原字符串
  9. printf("原字符串:%s\r\n",json_str);
  10.  
  11. //解析成json对象
  12. cJSON * json_obj = cJSON_Parse(json_str);
  13.  
  14. //格式输出
  15. char *json_print_str=NULL;
  16. json_print_str=cJSON_Print(json_obj);
  17. printf("\r\n输出内容:\r\n\r\n%s\r\n",json_print_str);
  18.  
  19. //释放资源
  20. free(json_print_str);
  21.  
  22. //释放资源
  23. cJSON_Delete(json_obj);
  24. }

json打包

cJSON_CreateObject函数可创建一个根数据项,在此之后就可以添加各种数据类型的子节点了,使用完成后需要通过cJSON_Delete()释放内存。

创建一层级的json

代码:

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. cJSON *root_obj = NULL;//根,json对象
  6. char *out_str = NULL; //输出结果
  7. root_obj =cJSON_CreateObject();//创建
  8. //添加一个字符串,参数(根对象,键,值)
  9. cJSON_AddStringToObject(root_obj, "key1", "dongxiaodong");
  10. //添加一个整型,参数(根对象,键,值)
  11. cJSON_AddNumberToObject(root_obj, "key2",);
  12. //添加一个浮点型,参数(根对象,键,值)
  13. cJSON_AddNumberToObject(root_obj, "key3",22.33);
  14. //添加一个bool类型,参数(根对象,键,值)
  15. //bool值可以是0/1或false/true
  16. cJSON_AddBoolToObject(root_obj, "key4",);
  17. //将json对象打包成字符串
  18. out_str = cJSON_PrintUnformatted(root_obj);
  19. //销毁json对象,释放内存
  20. cJSON_Delete(root_obj);
  21. //输出值:{"key1":"dongxiaodong","key2":1998,"key3":22.33,"key4":false}
  22. printf("%s",out_str);
  23. }

类型创建函数还有:

cJSON_AddNullToObject(cJSON * const object, const char * const name);

cJSON_AddTrueToObject(cJSON * const object, const char * const name);

cJSON_AddFalseToObject(cJSON * const object, const char * const name);

cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);

cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);

cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);

cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);

cJSON_AddObjectToObject(cJSON * const object, const char * const name);

cJSON_AddArrayToObject(cJSON * const object, const char * const name);

创建多层级的json

代码:

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. cJSON *root_obj = NULL;//根,json对象
  6. cJSON *item_obj = NULL;//二级json对象
  7. char *out_str = NULL; //输出结果
  8.  
  9. root_obj =cJSON_CreateObject();//创建
  10. //添加一个字符串,参数(根对象,键,值)
  11. cJSON_AddStringToObject(root_obj, "key1", "dongxiaodong");
  12. //添加一个整型,参数(根对象,键,值)
  13. cJSON_AddNumberToObject(root_obj, "key2",);
  14.  
  15. //创建一个子json对象
  16. item_obj= cJSON_AddObjectToObject(root_obj,"myson");
  17. //向孩子对象中添加内容
  18. cJSON_AddStringToObject(item_obj, "sonkey1", "东小东");
  19. cJSON_AddNumberToObject(item_obj, "sonkey2",);
  20.  
  21. //将json对象打包成字符串
  22. out_str = cJSON_PrintUnformatted(root_obj);
  23. //销毁json对象,释放内存
  24. cJSON_Delete(root_obj);
  25. //输出值:{"key1":"dongxiaodong","key2":1998,"myson":{"sonkey1":"东小东","sonkey2":2020}}
  26. printf("%s",out_str);
  27. }

创建多层json(数组形式)

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. cJSON *root_obj = NULL;//根,json对象
  6. cJSON *item_obj = NULL;//数组对象
  7. char *out_str = NULL; //输出结果
  8.  
  9. root_obj =cJSON_CreateObject();//创建
  10. //添加一个字符串,参数(根对象,键,值)
  11. cJSON_AddStringToObject(root_obj, "key1", "dongxiaodong");
  12. //添加一个整型,参数(根对象,键,值)
  13. cJSON_AddNumberToObject(root_obj, "key2",);
  14.  
  15. //创建一个子数组对象
  16. item_obj= cJSON_AddArrayToObject(root_obj,"myson");
  17. //向数组对象中添加内容
  18. cJSON_AddItemToArray(item_obj,cJSON_CreateTrue());
  19. cJSON_AddItemToArray(item_obj,cJSON_CreateNumber());
  20.  
  21. //将json对象打包成字符串
  22. out_str = cJSON_PrintUnformatted(root_obj);
  23. //销毁json对象,释放内存
  24. cJSON_Delete(root_obj);
  25. //输出值:{"key1":"dongxiaodong","key2":1998,"myson":[true,22]}
  26. printf("%s",out_str);
  27. }

创建的对象还可以是下面这些

cJSON_CreateNull(void);

cJSON_CreateTrue(void);

cJSON_CreateFalse(void);

cJSON_CreateBool(cJSON_bool boolean);

cJSON_CreateNumber(double num);

cJSON_CreateString(const char *string);

cJSON_CreateRaw(const char *raw);

cJSON_CreateArray(void);

cJSON_CreateObject(void);

创建混合json

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. cJSON *root_obj = NULL;//根,json对象
  6. cJSON *son_obj=NULL;
  7. cJSON *item_obj = NULL;//数组对象
  8. char *out_str = NULL; //输出结果
  9.  
  10. //根对象
  11. root_obj =cJSON_CreateObject();//创建
  12. //添加一个字符串,参数(根对象,键,值)
  13. cJSON_AddStringToObject(root_obj, "key1", "dongxiaodong");
  14. //添加一个整型,参数(根对象,键,值)
  15. cJSON_AddNumberToObject(root_obj, "key2",);
  16.  
  17. //创建一个子数组对象
  18. item_obj= cJSON_AddArrayToObject(root_obj,"myson");
  19. //向数组对象中添加内容
  20. cJSON_AddItemToArray(item_obj,cJSON_CreateTrue());
  21. cJSON_AddItemToArray(item_obj,cJSON_CreateNumber());
  22.  
  23. //子对象
  24. son_obj =cJSON_CreateObject();//创建
  25. //添加一个字符串,参数(根对象,键,值)
  26. cJSON_AddStringToObject(son_obj, "son1", "dongxiaodong");
  27. //添加一个整型,参数(根对象,键,值)
  28. cJSON_AddNumberToObject(son_obj, "son2",);
  29. cJSON_AddItemToArray(item_obj,son_obj);
  30.  
  31. //将json对象打包成字符串
  32. out_str = cJSON_PrintUnformatted(root_obj);
  33. //销毁json对象,释放内存
  34. cJSON_Delete(root_obj);
  35. //输出值:{"key1":"dongxiaodong","key2":1998,"myson":[true,22,{"son1":"dongxiaodong","son2":1998}]}
  36. printf("%s",out_str);
  37. }

json解析

解析一层级的json

代码:

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. //待解析字符串
  6. char *json_str="{\"key1\":\"dongxiaodong\",\"key2\":1998,\"key3\":22.33,\"key4\":true}";
  7. //解析成json对象
  8. cJSON * json_obj = cJSON_Parse(json_str);
  9.  
  10. //项存储
  11. cJSON *item=NULL;
  12.  
  13. //输出原字符串
  14. printf("原字符串:%s\r\n",json_str);
  15.  
  16. //获取string类型
  17. item=cJSON_GetObjectItem(json_obj,"key1");
  18. printf("\r\nkey1:%s\r\n",item->valuestring);
  19. cJSON_Delete(item);//释放资源
  20.  
  21. //获取数字
  22. item=cJSON_GetObjectItem(json_obj,"key2");
  23. printf("\r\nkey2:%d\r\n",item->valueint);
  24. cJSON_Delete(item);//释放资源
  25.  
  26. //获取数字
  27. item=cJSON_GetObjectItem(json_obj,"key3");
  28. printf("\r\nkey3:%f\r\n",item->valuedouble);
  29. cJSON_Delete(item);//释放资源
  30.  
  31. //获取bool
  32. item=cJSON_GetObjectItem(json_obj,"key4");
  33. printf("\r\nkey4:%d\r\n",item->valueint);
  34. cJSON_Delete(item);//释放资源
  35.  
  36. //是否资源
  37. cJSON_Delete(json_obj);
  38. }

解析多层级的json

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. //待解析字符串
  6. char *json_str="{\"key1\":\"dongxiaodong\",\"key2\":1998,\"myson\":{\"sonkey1\":\"东小东\",\"sonkey2\":2020}}";
  7. //解析成json对象
  8. cJSON * json_obj = cJSON_Parse(json_str);
  9.  
  10. //项存储
  11. cJSON *item=NULL;
  12. //内部项存储
  13. cJSON * item_item=NULL;
  14.  
  15. //输出原字符串
  16. printf("原字符串:%s\r\n",json_str);
  17.  
  18. //获取string类型
  19. item=cJSON_GetObjectItem(json_obj,"key1");
  20. printf("\r\nkey1:%s\r\n",item->valuestring);
  21. cJSON_Delete(item);//释放资源
  22.  
  23. //获取数字
  24. item=cJSON_GetObjectItem(json_obj,"key2");
  25. printf("\r\nkey2:%d\r\n",item->valueint);
  26. cJSON_Delete(item);//释放资源
  27.  
  28. //子串
  29. item=cJSON_GetObjectItem(json_obj,"myson");
  30. item_item=cJSON_GetObjectItem(item,"sonkey1");
  31. printf("\r\nmyson(sonkey1):%s\r\n",item_item->valuestring);
  32. cJSON_Delete(item_item);//释放资源
  33.  
  34. item_item=cJSON_GetObjectItem(item,"sonkey2");
  35. printf("\r\nmyson(sonkey2):%d\r\n",item_item->valueint);
  36. cJSON_Delete(item_item);//释放资源
  37.  
  38. cJSON_Delete(item);//释放资源
  39.  
  40. //释放资源
  41. cJSON_Delete(json_obj);
  42. }

 解析多层json(数组形式)

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. //待解析字符串
  6. char *json_str="{\"key1\":\"dongxiaodong\",\"key2\":1998,\"myson\":[true,113]}";
  7. //解析成json对象
  8. cJSON * json_obj = cJSON_Parse(json_str);
  9.  
  10. //项存储
  11. cJSON *item=NULL;
  12. //内部项存储
  13. cJSON * item_item=NULL;
  14.  
  15. //输出原字符串
  16. printf("原字符串:%s\r\n",json_str);
  17.  
  18. //获取string类型
  19. item=cJSON_GetObjectItem(json_obj,"key1");
  20. printf("\r\nkey1:%s\r\n",item->valuestring);
  21. cJSON_Delete(item);//释放资源
  22.  
  23. //获取数字
  24. item=cJSON_GetObjectItem(json_obj,"key2");
  25. printf("\r\nkey2:%d\r\n",item->valueint);
  26. cJSON_Delete(item);//释放资源
  27.  
  28. //获取子串
  29. item=cJSON_GetObjectItem(json_obj,"myson");
  30.  
  31. //输出数组大小
  32. printf("\r\n数组大小:%d\r\n",cJSON_GetArraySize(item));
  33.  
  34. //输出项1内容
  35. item_item=cJSON_GetArrayItem(item,);
  36. printf("\r\nmyson(0):%d\r\n",item_item->valueint);
  37. //cJSON_Delete(item_item);//释放资源
  38.  
  39. //输出项2内容
  40. item_item=cJSON_GetArrayItem(item,);
  41. printf("\r\nmyson(1):%d\r\n",item_item->valueint);
  42. cJSON_Delete(item_item);//释放资源
  43.  
  44. cJSON_Delete(item);//释放资源
  45.  
  46. //释放资源
  47. cJSON_Delete(json_obj);
  48. }

  解析混合json

代码

  1. #include <stdio.h>
  2. #include "cJSON.h"
  3. #include "cJSON.c"
  4. void main(){
  5. //待解析字符串
  6. char *json_str="{\"key1\":\"dongxiaodong\",\"key2\":1998,\"myson\":[true,22,{\"son1\":\"dongxiaodong\",\"son2\":1998}]}";
  7. //解析成json对象
  8. cJSON * json_obj = cJSON_Parse(json_str);
  9.  
  10. //项存储
  11. cJSON *item=NULL;
  12. //内部项存储
  13. cJSON * item_item=NULL;
  14.  
  15. //输出原字符串
  16. printf("原字符串:%s\r\n",json_str);
  17.  
  18. //获取string类型
  19. item=cJSON_GetObjectItem(json_obj,"key1");
  20. printf("\r\nkey1:%s\r\n",item->valuestring);
  21. cJSON_Delete(item);//释放资源
  22.  
  23. //获取数字
  24. item=cJSON_GetObjectItem(json_obj,"key2");
  25. printf("\r\nkey2:%d\r\n",item->valueint);
  26. cJSON_Delete(item);//释放资源
  27.  
  28. //获取子串
  29. item=cJSON_GetObjectItem(json_obj,"myson");
  30.  
  31. //输出数组大小
  32. printf("\r\n数组大小:%d\r\n",cJSON_GetArraySize(item));
  33.  
  34. //输出项1内容
  35. item_item=cJSON_GetArrayItem(item,);
  36. printf("\r\nmyson(0):%d\r\n",item_item->valueint);
  37. //cJSON_Delete(item_item);//释放资源
  38.  
  39. //输出项2内容
  40. item_item=cJSON_GetArrayItem(item,);
  41. printf("\r\nmyson(1):%d\r\n",item_item->valueint);
  42. cJSON_Delete(item_item);//释放资源
  43.  
  44. //项3内容
  45. item_item=cJSON_GetArrayItem(item,);
  46. cJSON *item_item_son=NULL;
  47.  
  48. item_item_son =cJSON_GetObjectItem(item_item,"son1");
  49. printf("\r\nmyson(2)(son1):%s\r\n",item_item_son->valuestring);
  50. cJSON_Delete(item_item_son);//释放资源
  51.  
  52. item_item_son =cJSON_GetObjectItem(item_item,"son2");
  53. printf("\r\nmyson(2)(son2):%d\r\n",item_item_son->valueint);
  54. cJSON_Delete(item_item_son);//释放资源
  55. cJSON_Delete(item_item);//释放资源
  56.  
  57. cJSON_Delete(item);//释放资源
  58.  
  59. //释放资源
  60. cJSON_Delete(json_obj);
  61. }

参考:

https://blog.csdn.net/shizhe0123/article/details/94742514

https://blog.csdn.net/fengxinlinux/article/details/53121287

https://www.cnblogs.com/skullboyer/p/8152157.html

不可不知的JSON处理库(cJSON)的更多相关文章

  1. c++ 使用json的库。cJSON

    cJSON官网是:http://sourceforge.net/projects/cjson/?source=recommended 最新版本是2013年的,与2009年的变化不是很大. 看了代码,觉 ...

  2. python 中的json解析库

    当一个json 数据很大的时候.load起来是很耗时的.python中常见的json解析库有cjson,simplesjson,json, 初步比较了一下, 对于loads来讲 simplejson ...

  3. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  4. fastjson是阿里巴巴的开源JSON解析库

    fastjson的API十分简洁. String text = JSON.toJSONString(obj); //序列化 VO vo = JSON.parseObject("{...}&q ...

  5. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  6. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  7. C++的Json解析库:jsoncpp和boost

    C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...

  8. Java JSON处理库Jackson

    Jackson是一款为Java平台提供的一套数据处理类库工具,Jackson的主要功能是提供JSON解析和生成.另外,Jackson还提供额外的类库以支持处理Avro, CBOR, CSV, Smil ...

  9. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

随机推荐

  1. jsp 中文乱码????解决

    中文乱码是个非常蛋疼的问题,在页面表单提交的时候后台获取数据变成了????,解决方案如下: 1:确认编码都是一致的如页面和后台都设置为utf-8 2:String str = new String(r ...

  2. Docker学习笔记(二):端口映射与容器互联

    端口映射 使用docker run时,可以指定-P(大写)与-p(小写)参数映射端口. docker run -P -P(大写)会随机映射一个端口到容器的内部端口 -> [feifei@ffma ...

  3. 浅谈PostgreSQL用户权限

    问题 经常在PG群里看到有人在问“为什么我对表赋予了权限:但是还是不能访问表” 解析 若你看懂德哥这篇文章PostgreSQL逻辑结构和权限体系介绍:上面对你就不是困扰你的问题 解决这个问题很简单:在 ...

  4. XShell 评估到期

    刚刚打开XShell弹出”评估到期“,点击确定后自动打开中文官网,得购买后才能使用. 当初下载的时候没留意到会有这一天.. 手头拮据的朋友可以通过下面方法绕过: 删除XShell. 到英文官网下载页找 ...

  5. 详细讲解使用Sublime Text 3进行Markdown编辑和实时预览

    所需安装的插件 Markdown Editing // Markdown编辑和语法高亮 Markdown Preview// Markdown导出html预览 LiveReload// 时时预览 安装 ...

  6. GeoServer2.17与Jetty9在Windows上的最佳安装实践

    1 JDK的选择 我使用了adopted openjdk8.0.252,安装简便,只需添加2个环境变量(JAVA_HOME,JRE_HOME)即可. 我的安装路径: C:\SDKs\adoptopen ...

  7. iOS开发常用技能点(持续更新中。。。)

    1,以屏幕原点开始布局  (默认从导航栏原点布局) self.extendedLayoutIncludesOpaqueBars = YES;   2,向button发送点击事件 [self.playB ...

  8. SQL——SELECT、UPDATE、DELETE和INSERT INTO

    SQL是一种ANSI的标准计算机语言.ANSI:美国国家标准化组织.除SQL标准外,大部分SQL数据库都拥有私有的扩展.SQL对大小写不敏感.某些数据库系统要求在SQL命令末端使用分号,这样可以执行一 ...

  9. SpringBoot整合SpringSecurity实现JWT认证

    目录 前言 目录 1.创建SpringBoot工程 2.导入SpringSecurity与JWT的相关依赖 3.定义SpringSecurity需要的基础处理类 4. 构建JWT token工具类 5 ...

  10. Robot Framework(13)- RF 循环的详细使用

    如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 前言 RF用   ...