我无法使用 cJSON 读取 UTF-8 json 文件

I Can't Read an UTF-8 json file with cJSON

提问人:muratkavak 提问时间:11/5/2023 最后编辑:tripleeemuratkavak 更新时间:11/5/2023 访问量:48

问:

我正在尝试使用 cJSON 读取 UTF-8 JSON 文件。但是我的代码不起作用。如果阻塞,它会不断进入“json 数据无法分离”。我试图从 ChatGPT 获得帮助,但它无能为力。我的项目截止日期即将到来。

这是我的代码:

C 文件:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "cJSON.c"

int main() {
    // JSON dosyasını aç
    FILE *file = fopen("data.json", "r, ccs=UTF-8");
    if (!file) {
        fprintf(stderr, "JSON dosyası açılamadı\n");
        return 1;
    }

    // JSON dosyasını oku
    char *json_data = NULL;
    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    json_data = (char *)malloc(file_size + 1);

    if (!json_data) {
        fprintf(stderr, "Bellek tahsis hatası\n");
        fclose(file);
        return 1;
    }

    if (fread(json_data, 1, file_size, file) != file_size) {
        fprintf(stderr, "JSON dosyası okunurken hata oluştu\n");
        fclose(file);
        free(json_data);
        return 1;
    }

    fclose(file);
    json_data[file_size] = '\0';

    // JSON verisini ayrıştır
    cJSON *json = cJSON_Parse(json_data);

    if (json == NULL) {
        fprintf(stderr, "JSON data couldn't seperated.\n");
        free(json_data);
        return 1;
    }

    // JSON verisini işleyin
    if (cJSON_IsArray(json)) {
        int array_size = cJSON_GetArraySize(json);
        for (int i = 0; i < array_size; i++) {
            cJSON *item = cJSON_GetArrayItem(json, i);
            cJSON *id = cJSON_GetObjectItem(item, "id");
            cJSON *name = cJSON_GetObjectItem(item, "name");
            cJSON *grades = cJSON_GetObjectItem(item, "grades");
            cJSON *course = cJSON_GetObjectItem(item, "course");

            printf("ID: %d\n", id->valueint);
            printf("Name: %s\n", name->valuestring);
            printf("Course: %s\n", course->valuestring);

            cJSON *midterm = cJSON_GetObjectItem(grades, "midterm");
            cJSON *final = cJSON_GetObjectItem(grades, "final");

            printf("Midterm Grade: %d\n", midterm->valueint);
            printf("Final Grade: %d\n", final->valueint);
        }
    }

    // Bellek temizleme
    cJSON_Delete(json);
    free(json_data);

    return 0;
}

JSON 文件:

[  
    {
        "id": 1,
        "name": "Ahmet Yılmaz",
        "grades": {
            "midterm": 75,
            "final": 85
        },
        "course": "BIL 203"
    },
    {
        "id": 2,
        "name": "Ayşe Kaya",
        "grades": {
            "midterm": 80,
            "final": 88
        },
        "course": "BIL 203"
    },
    {
        "id": 3,
        "name": "Mehmet Demir",
        "grades": {
            "midterm": 70,
            "final": 82
        },
        "course": "BIL 203"
    }
]

我的大学作业是读取数据并将其写入 CSV 文件。

C JSON CJSON

评论

0赞 tripleee 11/5/2023
确切的错误消息是什么?如果你传入一个非常琐碎的JSON文件,它能工作吗?
0赞 muratkavak 11/5/2023
json 等于 NULL。程序以此块结尾 if (json == NULL) { fprintf(stderr, “JSON data can't seperated.\n”); free(json_data); return 1; }
1赞 Shawn 11/5/2023
使用 / 获取文本文件的大小是错误的,尤其是在 Windows 上......fseek()ftell()
0赞 dimich 11/5/2023
失败后返回什么?cJSON_GetErrorPtr()cJSON_Parse()
1赞 Shawn 11/5/2023
fopen(filename, "rb")

答: 暂无答案