随着互联网的快速发展,越来越多的应用程序需要与服务器交互获取数据。而ON(JavaScript Object Notation)作为一种轻量级的数据交换格式,已经成为了服务器端和客户端之间的数据传输标准。然而,在使用C语言开发的应用程序中,如何调用服务器端的ON数据却是一大难题。本文将介绍。
一、使用第三方库
在C语言中,没有内置的ON解析库,因此我们需要借助第三方库来解析ON数据。一些流行的第三方ON解析库有:jansson、cON、ON-C等。其中,cON是一种轻量级、快速、可移植的ON解析器,可以方便地嵌入到C语言应用程序中。下面是使用cON库获取服务器端ON数据的代码示例:
“`c
#include
#include
#include
#include “cON.h”
#define BUFFER_SIZE (256 * 1024) /* 256 KB */
struct buffer_struct {
char *memory;
size_t size;
};
static size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct buffer_struct *mem = (struct buffer_struct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(ptr == NULL) {
/* out of memory! */
fprintf(stderr, “realloc() fled\n”);
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int mn(void)
{
CURL *curl;
CURLcode res;
struct buffer_struct buffer = {0};
char errors[256];
cON *root = NULL;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, “http://example.com/jsondata”);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buffer);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, “curl_easy_perform fled: %s\n”, curl_easy_strerror(res));
goto cleanup;
}
root = cON_Parse(buffer.memory);
if(!root) {
sprintf(errors, “json parse error before: [%s]\n”, cON_GetErrorPtr());
fprintf(stderr, “Error: %s\n”, errors);
goto cleanup;
}
printf(“%s\n”, cON_Print(root));
cleanup:
cON_Delete(root);
free(buffer.memory);
curl_easy_cleanup(curl);
}
return 0;
}
“`
在上述代码中,我们使用了curl库来获取服务器端的ON数据,并将其保存到一个指定大小的缓冲区中。然后,我们使用cON库解析这个ON数据并打印出来。需要注意的是,对于获取和解析ON数据的错误处理,我们需要使用cURL和cON库提供的相应接口进行处理。此处,我们简单地通过输出错误信息来处理错误。
二、手动解析方法
如果我们不想使用第三方解析库,也可以手动解析服务器端ON数据。虽然这种方法相对于使用现成的解析库需要更多的代码和时间,但是它也具有更高的可控性,可以更好地满足特定应用程序的需求。下面是手动解析ON数据的代码示例:
“`c
#include
#include
#include
#include
#define BUFFER_SIZE (256 * 1024) /* 256 KB */
struct buffer_struct {
char *memory;
size_t size;
};
static size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp)
{
size_t realsize = size * nmemb;
struct buffer_struct *mem = (struct buffer_struct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(ptr == NULL) {
/* out of memory! */
fprintf(stderr, “realloc() fled\n”);
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
char* get_value_by_key(char* json_str, char* key)
{
int i, j;
char *result = NULL;
/* Find key */
for (i=0; i
if (json_str[i] == ‘\”‘ && strncmp(json_str+i+1, key, strlen(key)) == 0
&& json_str[i+1+strlen(key)] == ‘\”‘ && json_str[i+1+strlen(key)+1] == ‘:’)
{
/* Find key’s value */
for (j=i+1+strlen(key)+2; j
if (json_str[j] == ‘\”‘) {
result = (char*)malloc((j-i-strlen(key)-3) + 1);
strncpy(result, json_str+i+1+strlen(key)+2, j-i-strlen(key)-3);
result[j-i-strlen(key)-3] = ‘\0’;
break;
}
}
break;
}
}
return result;
}
int mn(void)
{
CURL *curl;
CURLcode res;
struct buffer_struct buffer = {0};
char errors[256];
char *json_str = NULL;
char *value = NULL;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, “http://example.com/jsondata”);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&buffer);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, “curl_easy_perform fled: %s\n”, curl_easy_strerror(res));
goto cleanup;
}
/* Copy buffer to string */
json_str = (char*)malloc(buffer.size + 1);
strncpy(json_str, buffer.memory, buffer.size);
json_str[buffer.size] = ‘\0’;
/* Parse and get value by key */
value = get_value_by_key(json_str, “name”);
printf(“%s\n”, value);
cleanup:
free(json_str);
free(buffer.memory);
curl_easy_cleanup(curl);
}
return 0;
}
“`
在上述代码中,我们同样使用了curl库来获取服务器端的ON数据,但是进行了手动解析。我们定义了一个get_value_by_key函数,用于获取ON字符串中指定key的value值。在这个函数中,我们使用两个循环来分别查找指定key和这个key所对应的value值,并将其保存到一个新的字符串中返回。需要注意的是,对于获取和解析ON数据的错误处理同样需要特别注意。
结论
相关问题拓展阅读:
- cjson获取属性值后需要释放吗
- json是什么
cjson获取属性值后需要释放吗
需要。符串生成cjson指针的函数,使用后需要调用cON进行释放。cjson就是用来处理json格式数据的一个库。cjson是使用c语言猜颤塌编写的,它十分轻量级穗圆,可用在内存有限的嵌入式设备中,来处理与互联网的交互数据。洞饥
json是什么
ON(JavaScript Object Notation, 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编裂袜程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 ON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。简单来说:json就是一种在各个编程语言中肆晌激流通的数据格式,负责不同编程语言中的数据传递和交互。
扩展资料
注意事项:
1,json的键值对的键部分,必须用双引号”包裹,单引谨孝号都不行(所以如果在键中出现了关键字,也被字符化了),而js中对象没有强制要求(所以在键中不允许出现关键字)。
2,json的键值对的值部分,不允许出现函数function,undefined,NaN,但是可以有null,js中对象的值中可以出现。
3,json数据结束后,不允许出现没有意义的逗号,如:{“name”:”admin”,”age”:18,},注意看数据结尾部分18的后面的逗号,不允许出现。
参考资料来源:
百度百科-Json
ON(即json)简介:
ON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 ON采用完全独立于语言的文本格式,但是也使用了棚返纤类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使ON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。
ON语法规则:
ON 语法是 JavaScript 对象表示语法的子集。
数据在名称/值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
ON基础结构:
ON结构有两种结构:
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为世卖对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
数组:链仿数组在js中是中括号“”括起来的内容,数据结构为 ,取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
使用XML作为传输格式的优势:1. 格式统一, 符合标准2. 容易与其他系统进行远程交互, 数据共享比较方便缺点:1. XML文件格式文件庞谨答大, 格式复杂, 传输占用带宽2. 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护3. 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码4. 服务器端和客户端解析XML花费资源和时间那么除了XML格式, 还有没有其他格式, 有一种叫做碰者ON (JavaScript Object Notation) 的轻量级数据交换格式能够替代XML的工作.优点:1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小2. 易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行ON数据的读取3. 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析4. 在PHP世界, 已经有PHP-ON和ON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生ON格式, 便于客户端的访问提取. 另外PHP的PEAR类已经提出了支持 (
)5. 因为ON格式能够直接为服务器端代码使用, 大祥吵慧大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护缺点:1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性2. ON格式目前在Web Service中推广还属于初级阶段PS: 据说Google的Ajax是使用 ON+模板 做的啊
MySQL 从 5.7 开始,增加了新的数据类型扰并:ON。
ON 类型的出现,弥补了 MySQL 长期以来相比其他关系型数据库旅李族的非标准化特性略势,比如可以用 ON 来实现类似字典、数组等类型。以及之后大量针对 ON 类型字串的相关遍历方法与函数。
比如对数组来说拆弊,简单的遍历路径为 “$” 或者 “$” 来一次性遍历所有元素。MySQL 8.0 又新增了对于数组元素的范围遍历,比如 “$”,表示遍历下标为 m 到 n 的元素。
关于c json 调用服务器端的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。