首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用json-c转换几个JSON对象?

如何使用json-c转换几个JSON对象?
EN

Stack Overflow用户
提问于 2020-04-09 09:52:28
回答 1查看 886关注 0票数 0

我希望使用json-c库来转换文档中包含的所有对象:

代码语言:javascript
复制
{
    "name": "mathieu",
    "password": "def118e47a2f36b73805b01a5fa3f73b506b98166a929802338db6868e28d942",
    "salt": "nXvtCQEqx8l1uNheIJLoO8VI7049vgIS",
    "email": "mathieu@mail.com"
}
{
    "name": "cesar",
    "password": "487b36f3e5a3a74ec3bf2bf48cbc49cde249b08977d22394122c9d512d0e94b4",
    "salt": "Q3QnWFZnLXg8217V1uLaBka6R3CZvCfl",
    "email": "cesar@mail.com"
}

为了转换它们(暂时我只想显示),我使用了以下代码(我遵循了这个Youtube视频的说明):

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <json-c/json.h>

//#include "../../include/personnes.h"

//int parseMyJsonPersonne(){
int main(){
    FILE* fichier = NULL;
    char buffer[1024];

    struct json_object *parsed_json;
    struct json_object *name;
    struct json_object *password;
    struct json_object *salt;
    struct json_object *email;

    fichier = fopen("../../data/Personne.json", "r");
    if (fichier != NULL) {
        fread(buffer, 1024, 1, fichier);
    }
    else {
        printf("Une ERREUR est survenue lors du chargement des différents comptes\n");
        return 1;
    }
    fclose(fichier);

    printf("buffer : %s\n", buffer);

    parsed_json = json_tokener_parse(buffer);

    json_object_object_get_ex(parsed_json, "name", &name);
    json_object_object_get_ex(parsed_json, "password", &password);
    json_object_object_get_ex(parsed_json, "salt", &salt);
    json_object_object_get_ex(parsed_json, "email", &email);

    printf("name : %s\n", json_object_get_string(name));
    printf("password : %s\n", json_object_get_string(password));
    printf("salt : %s\n", json_object_get_string(salt));
    printf("email : %s\n", json_object_get_string(email));

    json_object_object_get_ex(parsed_json, "name", &name);
    printf("name 2 : %s\n", json_object_get_string(name));

    free(name);
    free(password);
    free(salt);
    free(email);

    return 0;
}

这就是终端在编译和执行之后向我展示的内容:

代码语言:javascript
复制
buffer : {
    "name": "mathieu",
    "password": "def118e47a2f36b73805b01a5fa3f73b506b98166a929802338db6868e28d942",
    "salt": "nXvtCQEqx8l1uNheIJLoO8VI7049vgIS",
    "email": "mathieu@mail.com"
}
{
    "name": "cesar",
    "password": "487b36f3e5a3a74ec3bf2bf48cbc49cde249b08977d22394122c9d512d0e94b4",
    "salt": "Q3QnWFZnLXg8217V1uLaBka6R3CZvCfl",
    "email": "cesar@mail.com"
}

name : mathieu
password : def118e47a2f36b73805b01a5fa3f73b506b98166a929802338db6868e28d942
salt : nXvtCQEqx8l1uNheIJLoO8VI7049vgIS
email : mathieu@mail.com
name 2 : mathieu

下面是我的各种问题

  1. 如何才能找到下一个对象并知道我的.json中的对象数量?
  2. 我认为初始化缓冲区到1024会导致问题,如果对象的数量太大,那么是否有办法使缓冲区一个一个地接收对象?
  3. 我有一种感觉,记忆的丧失是不对的,我是不是忘记了一些自由?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 10:43:40

json_tokener_parse()返回它在提供的缓冲区中找到的第一个JSON对象。调用它时,将其放入一个名为parsed_json的变量中。

由于您第二次尝试获取您一直传递给parsed_json的名称,

代码语言:javascript
复制
json_object_object_get_ex(parsed_json, "name", &name);
printf("name 2 : %s\n", json_object_get_string(name));

检索相同的名称。

您需要做的是通过调用json_tokener_parse_ex继续解析。根据文档的说法,它的接口是

代码语言:javascript
复制
JSON_EXPORT struct json_object* json_tokener_parse_ex( 
    struct json_tokener *   tok,
    const char *    str,
    int     len 
)

哪里

参数 tok以前与json_tokener_new()一起分配的json_tokener str具有任何有效的JSON表达式的字符串。不需要终止null。 len of str的长度

它基本上会像json_tokener_parse()一样解析输入缓冲区,但是在内部使用令牌时,当需要配置更多的东西时,令牌就能够提醒您。这是通过返回json_tokener_continue.来完成的

为了获得更多的信息,请参考文档。我只是在这里引用上面提供的文档链接中显示的示例:

代码语言:javascript
复制
json_object *jobj = NULL;
const char *mystring = NULL;
int stringlen = 0;
enum json_tokener_error jerr;

do
{
    mystring = ...  // get JSON string, e.g. read from file, etc...
    stringlen = strlen(mystring);
    jobj = json_tokener_parse_ex(tok, mystring, stringlen);
} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);

if (jerr != json_tokener_success)
{
    fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));

    // Handle errors, as appropriate for your application.
}

if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
{
    // Handle extra characters after parsed object as desired.
    // e.g. issue an error, parse another object from that point, etc...
}
// Success, use jobj here.

另一个解决方案

至于其他问题,我确认,如果JSON对象的数量不断增加,那么第一个或更高版本的缓冲区就会出现问题。处理这一问题可以找到另一种解决办法。

当然,----您可以一个一个地阅读它们,但是在从文件中读取时,您必须执行一些parsering操作。但是,如果您确信的文件结构将始终是您在问题中发布的文件结构,那么您就很幸运:您可以做的是

  1. fopen()文件,就像现在
  2. 使用fgets()而不是fread()逐行读取文件。将数据放入buffer
  3. 检查最后一行是否包含关闭的卷曲括号}。如果是,继续
  4. 现在,buffer正好包含一个对象。像以前一样调用json_tokener_parse(),并打印与json_object_object_get_ex()共享的数据
  5. 重复指向(2),直到到达文件末尾
  6. fclose()文件
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61118408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档