如何正确地转义字符串中的caracters以获得C中的JSON兼容格式?

时间:2015-08-25 14:19:48

标签: c json

我需要在C中以JSON格式创建将由Node.js脚本操作的字符串。 C程序不需要使用或操作JSON对象。

问题是我的字符串可能包含双引号和其他可能破坏JSON字符串的字符。因此,我需要一种简单的方法来相应地将字符串转义为JSON标准,尽可能轻量级。

我会很感激解决这个问题。提前谢谢!

3 个答案:

答案 0 :(得分:1)

一次循环输入字符串一个字符,并在必要时添加反斜杠:

void escape(char *in, char *out) {
    while (*in) {
        switch (*in) {
        case '\\':
        case '"':
            *(out++) = '\\';
            *(out++) = *in;
            break;
        case '\n':
            *(out++) = '\\';
            *(out++) = 'n';
            break;
        ...
        default:
            *(out++) = *in;
            break;
        }
        in++;
    }
}

答案 1 :(得分:0)

如果您可以使用glib,g_strescape例程可能会起作用:' https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strescape'

  

逃离特殊字符' \ b',' \ f',' \ n',' \ r',&#39 ; \ t',' \ v',' \'和'''在字符串源中插入' \'在他们面前。此外,范围0x01-0x1F(SPACE下面的所有内容)和0x7F-0xFF(所有非ASCII字符)范围内的所有字符都替换为' \'然后是八进制表示。异常中提供的字符不会被转义。

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * escape_string_for_json(char *str) {

    // allocate the length of str
    char *nstr = calloc(strlen(str) + 1, sizeof(char));

    // loop through each character
    long unsigned int c = 0;
    long unsigned int d = 0;
    while (c < strlen(str)) {
        printf("character: %c\n", str[c]);

        // json needs everything from '\x00' to '\x1f' escaped
        if (str[c] == '"' || str[c] == '\\' || ('\x00' <= str[c] && str[c] <= '\x1f')) {
            printf("\tescaping %c\n", str[c]);

            // add the escape character to nstr
            nstr[d] = '\\';

            // increment d to account for the extra space
            d++;

            // allocate that space in the nstr pointer
            nstr = realloc(nstr, d);

            // add the character
            nstr[d] = str[c];

        } else {
            // add the character to nstr
            nstr[d] = str[c];
        }

        c++;
        d++;

    }

    // add the \0 at the end
    nstr[d] = '\0';

    return nstr;

}

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

    printf("string to escape: \"%s\"\n", argv[1]);

    char *str;
    str = escape_string_for_json(argv[1]);

    printf("escaped string: \"%s\"\n", str);

    free(str);

}
gcc pgrm.c
./a.out "string to \" escape"