json_tokener_parse提供了意外的输出

时间:2018-11-15 12:55:11

标签: c++ c json-c

请考虑如下所示的代码段

            const char* jstring;
            jstring =  net->Classify(224, 224, imgCUDA,  &confidence);
            std::cout <<jstring << std::endl;
            join_prop = json_tokener_parse( jstring);
            printf("join prop is %s\n",json_object_to_json_string(join_prop));

调用Classify创建并返回json的位置。 分类方法的定义是

const char* Classify(  uint32_t width, uint32_t height,  float* rgb, float* confidence=NULL);

下面是分类中的代码段

    jstring =  json_object_to_json_string(properties);
    std::string jstring_str(jstring);
    json_object_put(properties);
    std::cout<< "jstring_str is : "<<jstring_str << std::endl;
    return jstring_str.c_str();

在此代码段的不同点,输出被打印到屏幕上。输出如下

  1. 在返回之前在jstring_str的分类值之内

    jstring_str是:{“ head_gear”:[{“ confidence”:0.000000,“ name”:“ None”},{“ confidence”:1.000000,“ name”:“ Cap”},{“ confidence”:0.000000 ,“ name”:“头盔”}]}

语句std::cout <<jstring << std::endl;的jstring中的

2值

{ "head_gear": [ { "confidence": 0.000000, "name": "None" }, { "confidence": 1.000000, "name": "Cap" }, { "confidence": 0.000000, "name": "Helmet" } ] }
  1. 但是,在join_prop命令的作用下,似乎出现了意外的输出,如下所示
  

加入道具为空

我曾期望令牌处理程序解析jstring并将其转换为json。 如果我能对为什么为什么将加入道具作为null有所了解,那将非常有帮助。任何见识都会有所帮助,因为我迷失了寻找原因的机会。

输出似乎是基于https://jsonformatter.curiousconcept.com/的有效json

1 个答案:

答案 0 :(得分:0)

这与json-c不相关,您只是在滥用str :: string。具体来说:

std::string jstring_str(jstring);
...
return jstring_str.c_str();

当您返回并离开该“ Classify”函数的作用域时,jstring_str对象将被销毁,并且c_str()调用返回的内存将不再有效。