json_tokener_parse дает неожиданный вывод - PullRequest
0 голосов
/ 15 ноября 2018

Рассмотрим фрагмент кода, как показано ниже

            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);

Фрагмент внутри Classify приведен ниже

    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. В пределах значения Classify jstring_str до возврата

    jstring_str: {"head_gear": [{"trust": 0.000000, "name":"Нет"}, {"доверие": 1.000000, "имя": "Кепка"}, {"доверие": 0.000000, "имя": "Шлем"}]}

2 значение в jstring из оператора std::cout <<jstring << std::endl;

{ "head_gear": [ { "confidence": 0.000000, "name": "None" }, { "confidence": 1.000000, "name": "Cap" }, { "confidence": 0.000000, "name": "Helmet" } ] }
Однако, по команде join_prop, кажется, что неожиданный вывод, как показано ниже

Пропуск объединения равен нулю

Я ожидал, что токенРазобрать jstring и преобразовать его в json.Было бы очень полезно, если бы я мог понять, почему я получаю команду prop как ноль.Любое понимание было бы полезно, так как я заблудился, пытаясь найти причину для этого.

Вывод, кажется, является действительным JSON на основе https://jsonformatter.curiousconcept.com/

1 Ответ

0 голосов
/ 11 марта 2019

Это не связано с json-c, вы просто неправильно используете str :: string.В частности:

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

Когда вы вернетесь и выйдете из области действия этой функции "Классифицировать", объект jstring_str будет уничтожен, а память, возвращенная вызовом c_str (), больше не будет действительной.

...