【问题标题】:json-c string with "/" character带有“/”字符的json-c字符串
【发布时间】:2017-06-19 17:28:59
【问题描述】:

当我的程序像这样在 json 中保存一些东西时:

 json_object_object_add(jObj_my, "cats/dogs", json_object_new_double(cats/dogs));

.json 文件中的结果是:

"cats\/dogs" : some_double_number

如何避免打印"\/" 而不是"/"

【问题讨论】:

  • 为什么是 -1 ?我搜索了它,找不到解决方案。
  • 可以尝试通过将'\' 放在其后面来保护角色'/'。不确定它是否可以工作。至于否决票,可能是因为您发布了伪代码。尝试提供Minimal, Complete and Verifiable example
  • @Badda,我尝试转义它,但编译器发出警告并以相同的方式打印。

标签: c escaping json-c


【解决方案1】:

其 GitHub 存储库中的 json-c 库代码有一个标志,可以使转义 / 成为可选。

如果您不希望生成的字符串转义,请使用JSON_C_TO_STRING_NOSLASHESCAPE 标志,如下所示:

#include <stdio.h>
#include <json.h>

int main(int argc, char **argv)
{
    json_object *my_string;

    my_string = json_object_new_string("/foo/bar/baz");
    printf("my_string=%s\n", json_object_get_string(my_string));
    printf("my_string.to_string()=%s\n", json_object_to_json_string(my_string));
    printf("my_string.to_string(NOSLASHESCAPE)=%s\n", json_object_to_json_string_ext(my_string, JSON_C_TO_STRING_NOSLASHESCAPE));
    json_object_put(my_string);

    return 0;
}

示例改编自https://github.com/json-c/json-c/blob/master/tests/test1.c#L155

将其保存在slashtest.c 中,编译并运行它会产生:

$ gcc -Wall slashtest.c -L/usr/local/lib -l:libjson-c.a -I/usr/local/include/json-c
$ ./a.out
my_string=/foo/bar/baz
my_string.to_string()="\/foo\/bar\/baz"
my_string.to_string(NOSLASHESCAPE)="/foo/bar/baz"

在 JSON 中转义 / 是合法的,并且可能很有用,请参阅这篇文章:JSON: why are forward slashes escaped?

请注意,此标志是在 2015 年添加到库的代码中的,但不知何故,该更改并未在 2016 年 6 月 7 日发布的最新当前 json-c-0.12.1 版本中实现。我不确定为什么.

所以要使用它,你必须从 GitHub 获取代码并编译它。

【讨论】:

  • 谢谢,但是当我编译它说 JSON_C_TO_STRING_NOSLASHESCAPE 没有定义。我还检查了 json-c 文档(我有 0.12 版),但找不到这个宏。还定义了一些其他宏,但没有一个是用于转义的。
  • @user3717434:它在 library's code on GitHub 中定义,而不是在 0.12 版本中,json_object.c 中的代码更改需要它才能工作。所以要使用它,你需要从 GitHub 获取库的全部代码,使用 README.md 指令编译和安装库来替换你的 0.12 安装,然后尝试使用这个标志编译你的代码。
  • 使用来自 GitHub 的源代码,它可以工作,但打印的结果更糟 :) json_object *mystr = json_object_new_string("cats/dogs"); json_object *myObj = json_object_new_object(); json_object_object_add(myObj, json_object_to_json_string_ext(mystr, JSON_C_TO_STRING_NOSLASHESCAPE),json_object_new_double(5.6)); 它打印的是 "\"cats\/\/dogs\""
  • 我从 GitHub 签出代码并测试了我的示例。由于json_object_to_json_string_ext(),我确实产生了一个非转义斜线。我更新了我的答案以表明这一点。在您的示例中,如果您希望“cats/dogs”作为键,双 5.6 作为值,只需执行:json_object *myObj = json_object_new_object(); json_object_object_add(myObj, "cats/dogs", json_object_new_double(5.6)); printf("res = %s\n", json_object_to_json_string_ext(myObj, JSON_C_TO_STRING_NOSLASHESCAPE));,它将打印:res = {"cats/dogs":5.5999999999999996}
  • 感谢您的回答,这对我很有帮助。我正在将base64编码的字符串添加到json文件中,我遇到了这个问题。在您的回答中建议使用标志帮助我摆脱了这个问题。 json_object *jfile = json_object_new_object(); json_object *jb64 = json_object_new_string(base64_encoded_signature) json_object_object_add(jfile, "sign", j64); json_object_to_file_ext(文件名, jfile, JSON_C_TO_STRING_NOSLASHESCAPE);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多