当前位置: 首页 > 知识库问答 >
问题:

有没有办法有效地将rapidjson与std::string结合使用?

陈富
2023-03-14

我想和rapidjson一起工作。

我想生成字符串并将其添加到某个对象中。

我在使用qjson时使用了std::字符串,但在rapidjson的情况下似乎不合适。我不想生成字符串,然后复制它,字符串对象的生存期在对象(rapidjson::Value)生存期之前结束(因此generated_string.c_str()不是一个情况)。json中可能有\0,所以,char*用空终止字符串也不是一个解决方案。

所以,我必须写我自己的字符串类型?或者使用类似

auto create_string_object() -> rapidjson::GenericStringRef<char>
{
   size_t len;
   char* result;
    // generate char* result with length len
   const char* return_value = result;
   return rapidjson::StringRef(return_value,len);
}
auto create_object_object(rapidjson::Document::AllocatorType &allocator) -> rapidjson::Value
{
   // ...
   rapidjson::Value result(rapidjson::kObjectType);
   rapidjson::Value tmp;  // tmp = create_string_object() will not compile
   tmp = create_string_object();
   result.AddMember("key", tmp, allocator); 
   // ...
}

或者还有其他一些处理字符串的方法?这对我来说似乎很难。我们不能将字符串移动到rapidjson::Value,因为Value中的结构不同,我们不能将Value中的指针设置为c_str(),因为字符串将在Value之前被销毁。即使使用GenericStringRef

顺便问一下,为什么RAPIDJSON_HAS_STDSTRING默认为0?工作中的一些问题?我看到我可以将字符串复制到rapidjson::Value和复制指针,如果我知道字符串生存期将在值生存期之前结束。

UPD:现在我看到rapidjson只释放被复制的字符串:

  //! Destructor.
  /*! Need to destruct elements of array, members of object, or copy-string.
  */
  ~GenericValue() {
      if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
          switch(flags_) {
          case kArrayFlag:
              for (GenericValue* v = data_.a.elements; v != data_.a.elements + data_.a.size; ++v)
                  v->~GenericValue();
              Allocator::Free(data_.a.elements);
              break;

          case kObjectFlag:
              for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
                m->~Member();
              Allocator::Free(data_.o.members);
              break;

          case kCopyStringFlag:
              Allocator::Free(const_cast<Ch*>(data_.s.str));
              break;

          default:
              break;  // Do nothing for other types.
          }
      }
  }

所以,正如在回答中所说的,在我的代码中这样使用GenericStringRef是个坏主意,因为在这种情况下,我必须自己管理内存。


共有1个答案

郑承恩
2023-03-14

我不完全理解这个问题。但我想在这里澄清几件事。

  1. GenericStringRef用于防止字符串复制。仅当已知字符串的生存期足够时,才应使用它。对于动态创建的字符串,通常不应使用GenericStringRef
  2. 设置RAPIDJSON_HAS_STDSTRING=1即可。默认情况下,它不会打开,因为它的支持是在早期发布后添加的。我不希望RapidJSON标题包含

 类似资料:
  • 我正在编写一个具有简单隐写实现的程序。 我有一个问题,因为如果我对一个像素使用setRGB,然后使用getRGB,我会得到不同的值。我读到setRGB和getRGB不是字节和位运算的最佳方案,但也许有一种方法?我想使用每个像素的阿尔法红、绿、蓝的LSB,但我不知道如何使用光栅,老实说,我花了很多时间编写一些代码来生成适当的TYPE_INT_ARGB值。。。我想使用ARGB中的每2个LSB,所以我有

  • 问题内容: 请考虑以下表格: 部 员工 编写查询以返回人员总数为4或更多的那些部门的雇员的empname和deptname列。记录应按姓氏的字母顺序返回 这是我的看法: 您将如何对此进行改进? 问题答案: 这比较短,而且执行速度可能也更快 从分组开始。您不需要内部查询中的COUNT。然后,联接两个表只是为了获得名称。 *之所以使用 *INNER JOIN, 是因为一旦计数完成,我们已经知道 员工存

  • 问题内容: java.lang.RuntimeException是“不要为AdapterView调用setOnClickListener。您可能需要setOnItemClickListener,”但这是不正确的。我正在使用setOnItemClickListener根据新选择执行某些操作,但是在用户更改选择之前,我还需要执行一些操作。具体来说,由于每个选择都与不同的数据集相关联,因此我正在收集每个

  • 我解释我这篇文章的目标。 实际上,我想重写如何Android工作的基本上,与应用程序中的字符串。此时此刻,我可以从重写android资源中动态更改它 实际上,我有这个功能,只有当我使用时才能正常工作: 有一种简单的方法,不需要太多代码,就可以覆盖xml中的行为?

  • 问题内容: 我正在寻找有关应用引擎如何处理字符编码的一些解释。我正在处理服务器位于应用程序引擎上的客户端服务器应用程序。 这是一个从头开始构建的新应用程序,因此我们到处都使用UTF-8。客户端通过POST(x-www-form- urlencoded)将一些字符串发送到服务器。我收到他们并回声他们。当客户取回它时,它就是ISO-8859-1!POST到blobstore时,当参数以UTF-8,mu

  • 我需要结合两个反应性出版商的结果——Mono和Flux。我尝试使用和函数来实现这一点,但我无法满足两个特定条件: 结果包含的元素应与通量发射的元素一样多,但相应的Mono源只应调用一次(仅此条件可通过实现) 当通量为空时,链应在不等待单一元素的情况下完成 第一个条件的解决方案出现在结合单声道和通量条目中(粘贴在下面)。但是我无法在不阻塞链的情况下实现第二个条件——这是我想避免的。