让jsoncpp支持单引号的字符串

本文介绍了一次针对JSONcpp库的定制化修改过程,为了解决PHP-Dubbo配置中使用单引号的问题,作者扩展了JSONcpp的reader类以支持单引号。这一改动涉及多个函数的调整,并引入了新的枚举类型来区分不同类型的字符串。

因为开发 php-dubbo,需要配置比较多,因此引进jsoncpp作为服务器属性配置,结果发现jsoncpp只支持双引号,

因此扩展reader类,让它支持单引号

修改的函数包括:

 bool readString(Char c); c->‘或者"

 bool  decodeString(Token& token, Char s);

 bool decodString(Token& token, Char s, std::string &decoded)

 bool readObject(Token &tokenStart)

枚举类型 TokenType::tokenString变为tokenStringDouble和tokenStringSingle分别表示"和'的字符串

 

转载于:https://my.oschina.net/aruan/blog/406562

<think>好的,用户现在问的是关于jsoncpp生成的JSON字符串包含换行符的问题。首先,我需要回忆一下jsoncpp这个库的基本使用情况。jsoncpp是一个C++库,用于解析和生成JSON数据。默认情况下,jsoncpp生成的JSON字符串是紧凑的,没有多余的换行符或者空格。但用户提到生成的字符串包含换行符,这可能是因为他们在生成JSON时启用了某种格式化选项。 接下来,我需要确认用户的使用场景。用户可能是在调试或输出JSON时发现字符串中有换行符,这可能会影响某些需要紧凑JSON格式的系统之间的数据传输。比如在API调用中,紧凑的JSON更常见,因为体积更小,传输更快。但如果是为了可读性,格式化后的JSON更易于阅读,这时候换行符是有用的。 然后,我需要考虑用户可能的真实需求。用户可能遇到了因为换行符导致的问题,例如解析错误,或者希望去除换行符以减少数据大小。也有可能用户只是好奇为什么会有换行符,而之前没有意识到jsoncpp的格式化选项。 再来看jsoncpp的具体实现。jsoncppJson::Value类有一个toStyledString方法,这个方法会生成带有缩进和换行的格式化JSON。而如果要生成紧凑的JSON,应该使用Json::FastWriter或者Json::StreamWriterBuilder来配置写入选项,禁用缩进和换行符。 用户可能需要具体的代码示例,来展示如何生成不带换行符的JSON字符串。例如,使用FastWriter的话,虽然这个类已经被标记为过时,但在旧版本的jsoncpp中可能还在使用。而新版本推荐使用StreamWriterBuilder,通过设置indentation参数为空字符串来禁用缩进,从而去除换行符。 另外,用户可能不知道不同版本jsoncpp的API变化。比如,在较新版本中,FastWriter可能已经被废弃,转而使用StreamWriterBuilder。这时候需要提供适用于不同版本的解决方案,帮助用户根据他们使用的版本来调整代码。 同时,还需要考虑用户可能遇到的常见问题,例如即使使用了正确的写入器,换行符仍然存在,这可能是因为其他地方的代码错误地调用了格式化方法,或者配置参数没有正确设置。这时候需要提醒用户检查他们的代码,确保使用的是正确的写入配置。 最后,总结用户的需求,他们可能希望控制JSON输出的格式,无论是为了可读性还是数据传输的需要。因此,明确如何根据需求开启或关闭换行符是关键点,需要给出清晰的步骤和代码示例,帮助用户实现他们想要的JSON格式。</think>`jsoncpp` 生成的 **JSON 字符串包含换行符**通常是默认格式化(缩进美化)导致的,目的是提高可读性。以下是关键点说明和解决方案: --- ### **1. 默认行为** - 使用 `jsoncpp` 的 `toStyledString()` 方法时,生成的 JSON 会自动添加**换行符**和**缩进**,例如: ```cpp Json::Value root; root["name"] = "Alice"; root["age"] = 25; std::string jsonStr = root.toStyledString(); // 包含换行和缩进 ``` 输出: ```json { "name" : "Alice", "age" : 25 } ``` --- ### **2. 如何禁用换行符(生成紧凑JSON)** 若需生成无换行符的紧凑 JSON 字符串,需使用 `Json::FastWriter` 或 `Json::StreamWriterBuilder` 配置输出格式。 #### **方法 1:使用 `Json::FastWriter`**(旧版本) ```cpp #include <json/json.h> Json::Value root; root["name"] = "Alice"; root["age"] = 25; Json::FastWriter writer; std::string jsonStr = writer.write(root); // 紧凑格式,无换行符 ``` 输出: ```json {"name":"Alice","age":25} ``` #### **方法 2:使用 `Json::StreamWriterBuilder`**(新版本推荐) ```cpp #include <json/json.h> Json::Value root; root["name"] = "Alice"; root["age"] = 25; Json::StreamWriterBuilder writer; writer["indentation"] = ""; // 禁用缩进和换行 std::string jsonStr = Json::writeString(writer, root); ``` 输出同样为紧凑格式。 --- ### **3. 换行符的使用场景** - **调试/日志输出**:换行符使 JSON 更易读。 - **网络传输/存储**:禁用换行符以减小体积(如 HTTP 接口返回 JSON)。 --- ### **4. 注意事项** - **版本兼容性**:`Json::FastWriter` 在较新版本中可能被废弃,优先使用 `StreamWriterBuilder`。 - **手动处理**:若需自定义格式(如特定缩进),可通过 `writer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值