0

cJSON を使用して Web サーバー上の CGI ファイルによって受信された JSON ファイルを解析しようとしていますが、JSON の最初の数字が 0 に変更され続けます。

これをテストするために使用している短いコードを作成しました。

int main(int argc, char *argv[])
{
    cJSON *pstReq;
    char *pcReq = getenv("QUERY_STRING");

    printf("Content-Type: application/json\n\n");

    URLDecode(pcReq) /* Decodes the query string to JSON string */
    pstReq = cJSON_Parse(pstReq);

    printf("%d\n", cJSON_GetObjectItem(pstReq, "test")->valueint);
    printf("%d\n", cJSON_GetObjectItem(pstReq, "test2")->valueint);
    printf(cJSON_Print(pstReq));

    return EXIT_SUCCESS;
}

クエリ文字列を介して JSON {"test":123, "test2":123} をこれに渡すと、プログラムは次のように出力します。

0
123
{"test":0, "test2":123}

ここで何が間違っているのか、誰かが私に何が問題なのかを教えてくれたら、私はそれを大いに感謝します。

4

1 に答える 1

0

URLDecode がどのように機能するか、または環境から取得された後の pcReq の元の内容が何であるかを知らずに知ることは困難です。Web なしでこのコードを実行することから始めて、cJSON を小さな単位としてテストすると、おそらく何が問題なのかが明らかになるでしょう。

まず、コードを理解できるように、以下のコードをご覧ください。

pstReq = cJSON_Parse(pstReq);

私はあなたが意味したと思います:

pstReq = cJSON_Parse(pcReq);

それを念頭に置いて、最初に次のコードを実行します。

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

int main(int argc, char *argv[])
{
    cJSON *pstReq;

    char *pcReq = "{\"test\":123, \"test2\":123}";
    pstReq = cJSON_Parse(pcReq);

    printf("%d\n", cJSON_GetObjectItem(pstReq, "test")->valueint);
    printf("%d\n", cJSON_GetObjectItem(pstReq, "test2")->valueint);
    printf("%s\n",cJSON_Print(pstReq));

    return EXIT_SUCCESS;
}

これは私にとって期待どおりに機能します。

これでも正しい出力が生成される場合は、printf() を追加して、URLDecode() の前後に pcReq に何が含まれているかを確認します。問題は「pcReq」自体に起因する可能性があります。要するに、これは問題がどこにあるかのアイデアを与えるかもしれないコードです:

int main(int argc, char *argv[])
{
    cJSON *pstReq;
    char *pcReq = getenv("QUERY_STRING");

    printf("Content-Type: application/json\n\n");

    printf ("=== pcReq before decoding ===\n");
    printf("%s\n",pcReq);
    printf ("=============================\n");

    URLDecode(pcReq); /* Decodes the query string to JSON string */

    printf ("=== pcReq after decoding ===\n");
    printf("%s\n",pcReq);
    printf ("=============================\n");

    pstReq = cJSON_Parse(pcReq);

    printf("%d\n", cJSON_GetObjectItem(pstReq, "test")->valueint);
    printf("%d\n", cJSON_GetObjectItem(pstReq, "test2")->valueint);
    printf("%s\n",cJSON_Print(pstReq));

    return EXIT_SUCCESS;
}

これが問題の発見に役立つことを願っています。

于 2015-02-11T23:29:34.707 に答える