C中的JSON解析器提示

时间:2014-08-14 19:43:42

标签: c json api

首先我知道那里有很多列表,在过去的3天里我可能会检查出10多个免费的json-parsers。我仍在寻找的原因可能是因为我没有找到工作的例子/信息/什么来得到我想要的工作非常简单。我非常肯定这最终会被报告为reask但是我仍然请求C expierence中有JSON的人给我一个快速的提示,因为这可能会让我安全的谷歌搜索和寻找我需要的API大约10行代码。

数据作为字符串传递,与' 分开

JSON Data (Array)
string, string, int (Array)

Username,Password,2.4.0

基本上我只需要一个提供与

类似的api

[SWF] JSON-> Stringify();

["Username","Password","2.4.0"]

很抱歉,如果您认为这是一个烦人的转发,但感谢您的阅读。

What I want to do in C

enter image description here

2 个答案:

答案 0 :(得分:0)

我在C"中没有任何" JSON;经验,但我发现这个问题很有趣,并搜索了一些C JASON解析器。我遇到了http://zserge.bitbucket.org/jsmn.html

嗯,这里有一些工作代码可以为您的输入执行一些非常基本的和非常规的字符串化操作。也许这会有所帮助:)

#include <stdio.h>
#include <string.h>
#include "jsmn.h"

#define TOKEN_PRINT(t) \
    printf("start: %d, end: %d, type: %d, size: %d\n", \
            (t).start, (t).end, (t).type, (t).size)

#define IN_POS_LEN(in, t) \
    (in) + (t).start, (t).end - (t).start

int main()
{
    static const char input[] = "['Mark','Secret','2.4.0']";

    /* declare and init jsmn parser as per documentation
    (or as per jsmn_test.c if documentation was not working) */
    jsmn_parser parser;
    jsmntok_t tok[256];
    int r;
    jsmn_init(&parser);

    /* parse input and check for success and expected format */
    r = jsmn_parse(&parser, input, strlen(input), tok, 256);
    if(r >= 0
        && tok[0].type == JSMN_ARRAY)
    {
        /* now, 'stringify' an array of strings */
        int stringNum;
        for(stringNum = 1; stringNum <= tok[0].size; ++stringNum)
        {
            char tmp[128] = {0};
            memcpy(tmp, IN_POS_LEN(input, tok[stringNum]));
            printf("%s%s", tmp, stringNum == tok[0].size ? "\n" : ", ");
        }
    }
}

必须根据文档构建jsmn库(开箱即用)。编译,链接和运行给出:

➜  jsmn  gcc mytest.c -L . -ljsmn; ./a.out
'Mark', 'Secret', '2.4.0'

编辑: 好吧,如果我理解正确,你只想从C中的一些变量生成那些登录字符串格式?然后我想我甚至不会使用任何API,因为它很容易用C:http://coliru.stacked-crooked.com/a/90a14edbe59db74a

答案 1 :(得分:0)

结束了这样的事情。只是发布以防有人遇到类似的东西。无论如何,我最终使用frozen JSON解析器进行解析,并使用json-parser进行验证。

BOOL IsNumber(const char *string)
{
    char *pch;
    pch = string;
    while (*pch != '\0')
    {
        if (!isdigit(*pch)) return FALSE;
        pch++;
    }
    return TRUE;
}

char* test(const char *Data)
{
    char *retVal = NULL;
    char *buffer;
    char *ptr;
    int len;

    buffer = (char*)malloc(strlen(Data) + 1);
    strcpy(buffer, Data);
    ptr = strtok(buffer, ",");
    if (ptr)
    {
        len = 2;
        retVal = (char*)malloc(2);
        strcpy(retVal, "[");
        do
        {
            len += strlen(ptr) + 1;
            if (IsNumber(ptr))
            {
                retVal = (char*)realloc(retVal, len);
                sprintf(retVal, "%s%s,", retVal, ptr);
            }
            else
            {
                len += 2;
                retVal = (char*)realloc(retVal, len);
                sprintf(retVal, "%s\"%s\",", retVal, ptr);
            }
            ptr = strtok(NULL, ",");
        }
        while (ptr != NULL);
        retVal[len - 2] = ']';
    }
    free(buffer);
    return retVal;
}