2016-04-30 4 views
0

У меня есть класс, представляющий объект в 3-пространстве, и метод to_json, который выводит const char * для преобразования объекта в JSON для записи в базу данных на основе документа. Однако метод to_json выводит неизвестные символы, а не в формате JSON сообщениеC++ RapidJSON Writer и String Buffer вывод неизвестных символов

const char* Obj3::to_json() const 
{ 
    logging->info("Obj3:To JSON Called"); 
    //Initialize the string buffer and writer 
    StringBuffer s; 
    Writer<StringBuffer> writer(s); 

    //Start writing the object 
    //Syntax taken directly from 
    //simplewriter.cpp in rapidjson examples 

    writer.StartObject(); 

    writer.Key("key"); 
    std::string key = get_key(); 
    writer.String(key.c_str(), (SizeType)key.length()); 

    writer.Key("owner"); 
     std::string owner_dev = get_owner(); 
     writer.String(owner_dev.c_str(), (SizeType)owner_dev.length()); 

    writer.Key("name"); 
    std::string name = get_name(); 
    writer.String(name.c_str(), (SizeType)name.length()); 

    writer.Key("type"); 
    std::string type = get_type(); 
    writer.String(type.c_str(), (SizeType)type.length()); 

    writer.Key("subtype"); 
    std::string subtype = get_subtype(); 
    writer.String(subtype.c_str(), (SizeType)subtype.length()); 

    int i; 
    int j; 

    writer.Key("location"); 
    writer.StartArray(); 
    for (i=0; i<3; i++) { 
     writer.Double(static_cast<double>(get_loc(i))); 
    } 
    writer.EndArray(); 

    writer.Key("transform"); 
    writer.StartArray(); 

     for (i=0; i<4; i++) { 
     writer.StartArray(); 
     for (j=0; j<4; j++) { 
       writer.Double(static_cast<double>(transform_matrix(i, j))); 
     } 
     writer.EndArray(); 
     } 

     writer.EndArray(); 

    writer.Key("scenes"); 
    writer.StartArray(); 
     for (i=0; i<num_scenes(); i++) { 
     std::string sc = get_scene(i); 
       writer.String(sc.c_str(), (SizeType)sc.length()); 
     } 
     writer.EndArray(); 

    writer.Key("locked"); 
    writer.Bool(is_locked); 

    writer.EndObject(); 

    //The Stringbuffer now contains a json message 
    //of the object 
    if (writer.IsComplete()) { 
     logging->debug("Valid JSON Encountered"); 
     try { 
      return s.GetString(); 
     } 
     catch (std::exception& e) { 
      logging->error("Exception Encountered parsing JSON"); 
      logging->error(e.what()); 
     } 
    } 
    else { 
     return ""; 
    } 

} 

Журналы показывают ниже вывод:

2016-04-30 13:15:54,151 [INFO] Obj3:To JSON Called 
2016-04-30 13:15:54,151 [DEBUG] Valid JSON Encountered 
�� 

Я закрыл все массивы и корневой объекта, и находятся проверка полноты за API, однако вывод не читается через std :: cout или log4cpp.

--Edit--

Per ниже ответа, я обновил тип возврата к StD :: строки и возвратное заявление ниже:

//The Stringbuffer now contains a json message 
//of the object 
if (writer.IsComplete()) { 
    logging->debug("Valid JSON Encountered"); 
    try { 
     const char* ret_val = s.GetString(); 
     std::string ret_string (ret_val); 
     return ret_string; 
    } 
    catch (std::exception& e) { 
     logging->error("Exception Encountered parsing JSON"); 
     logging->error(e.what()); 
    } 
} 
else { 
    return ""; 
} 

что приводит к ошибке сегментации.

Метод вызывается в тесте, как показано ниже:

std::cout << obj.to_json() << std::endl;

ответ

1

const char * возвращаемое значение указывает на значение s, который находится на стеке. Он освобождается, прежде чем использовать его.

Вместо этого подумайте о том, чтобы функция возвращала тип строки (например, std :: string), которая сохраняет свое хранилище.

+0

См. Обновления выше, я попытался заменить тип возврата и получил ошибку сегментации. –

+0

Где это segfault? На самом деле это происходит с возвратом? Вам действительно не нужно временное, вы можете просто вернуть s.GetString() 'с возвращаемым типом' std :: string'. Кроме того, 'Writer :: String()' также может принимать строку std ::. –

+0

В обоих случаях может возвращаться один способ отладки. Таким образом, вы можете подтвердить, что измененный тип возвращаемого значения не так или иначе связан с segfault. –

 Смежные вопросы

  • Нет связанных вопросов^_^