我将cJSON
与JNI结合使用,在我的Java和C组件之间来回传递JSON数据。
我是C的新手并自学,所以请耐心等待。
cJSON
有一个很好的函数cJSON->Print
,它将JSON结构转换为字符串表示形式。这很棒,除了字符串在" JSON Pretty"格式,所有换行符和制表符都保持不变。我不需要任何这些,因为我的应用程序不显示JSON,它只是用它来进行数据传输。所以,我试图写一个能删除多余字符的函数。
void json_clean(char *buffer, const char *pretty) {
int count = 0;
for(int i = 0; i < strlen(pretty); i++) {
if(pretty[i] == '\n' || pretty[i] == '\t')
continue;
buffer[count] = pretty[i];
count++;
}
int last = strlen(buffer) - 1;
buffer[last] = '\0';
}
这有效地删除了\n
和\t
字符,但有时最后我会收到一些垃圾字符,例如6
或?
,这会导致我认为这是一个空终止问题。
在C语言中使用printf
并在Java中打印出来时,字符串的出现方式相同。
在调用函数之前,我确保为NUL
字符分配比我需要的字节多一个字节:
// get the pretty JSON
const char *pretty = cJSON_Print(out);
// how many newlines and tabs?
int count = 0;
for(int i = 0; i < strlen(pretty); i++) {
if(pretty[i] == '\n' || pretty[i] == '\t')
count++;
}
// make new buffer, excluding these chars
char *newBuf = malloc((strlen(pretty) - count) + 1); // +1 for null term.
json_clean(newBuf, pretty);
// copy into new Java string
jstring retVal = (*env)->NewStringUTF(env, newBuf);
free(newBuf); // don't need this anymore
非常感谢任何帮助。
答案 0 :(得分:0)
解决方案是手动设置空字符的索引,而不是依靠strlen
来计算最后一个索引(它只查找空字符)。如果缓冲区中没有空字符,strlen
不会产生有用的结果。
buffer[count] = '\0';