jsoncpp解析json,遇到个别汉字会返回false解析不了

roy655 2014-09-03 01:41:45
用jasoncpp解析json遇到个别字就解析不了了,parsedOk 返回false。

AnsiString sJson = “xxxxxx”;
Json::Reader reader;
Json::Value json_Value;
bool parsedOk = reader.parse(sJson.c_str(),json_Value);
if(!parsedOk)
{
}


不能解析的文字列表:
乗 俓 僜 刓 匼 哱 圽 塡 奬 媆 峔 嶾 廫 慭 怽 揬 昞 朶 梊 榎 橽 歕 沑 漒 瀄 焅 燶 猏 玕 琝 甛 璡 痋 盶 癨 瞈 砛 碶 穃 竆 筡
篭 糪 絓 綷 縗 繺 羂 耚 肻 腬 臶 臷 芢 蒤 薥 蚛 蝄 蟎 衆 蟎 裓
覾 譢 豛 赲 踈 躙 輁 郳 醆 鈂 鉢 鎈 鏫 閈 闬 隲 頫 颸 餦 馶 骪
鯸 鮘 鳿 鵟 鸤 黒 齖
...全文
4974 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxufire 2015-07-19
  • 打赏
  • 举报
回复
引用 11 楼 LinuxCard 的回复:
String ss="乗 俓 僜 刓 匼 哱 圽 塡 奬 媆 峔 嶾 廫 慭 怽 揬 昞 朶 梊 榎 橽 歕 沑 漒 瀄 焅 燶 猏 玕 琝 甛 璡 痋 盶 癨 瞈 砛 碶 穃 竆 筡"; root["firstName"] = AnsiString(ss).c_str(); Json::StyledWriter styled_writer; int l=styled_writer.write(root).length(); char *s1 = new char[1024]; memset(s1, 0, 1024); strncpy(s1, styled_writer.write(root).c_str(),l); // 解析 Json::Reader reader; Json::Value json_object; if (!reader.parse(s1, json_object)) ShowMessage("error"); else ShowMessage(json_object["firstName"].asString().c_str()); 以上代码测试通过,bcb2010
具体怎么用呢?
LinuxCard 2014-09-18
  • 打赏
  • 举报
回复
String ss="乗 俓 僜 刓 匼 哱 圽 塡 奬 媆 峔 嶾 廫 慭 怽 揬 昞 朶 梊 榎 橽 歕 沑 漒 瀄 焅 燶 猏 玕 琝 甛 璡 痋 盶 癨 瞈 砛 碶 穃 竆 筡"; root["firstName"] = AnsiString(ss).c_str(); Json::StyledWriter styled_writer; int l=styled_writer.write(root).length(); char *s1 = new char[1024]; memset(s1, 0, 1024); strncpy(s1, styled_writer.write(root).c_str(),l); // 解析 Json::Reader reader; Json::Value json_object; if (!reader.parse(s1, json_object)) ShowMessage("error"); else ShowMessage(json_object["firstName"].asString().c_str()); 以上代码测试通过,bcb2010
LinuxCard 2014-09-15
  • 打赏
  • 举报
回复
额,的确有问题,刚看错了
LinuxCard 2014-09-15
  • 打赏
  • 举报
回复
我没碰到楼主的问题啊,用楼主的代码测试也没问题i啊?
gzliudan 2014-09-09
  • 打赏
  • 举报
回复
能在C++ Builder里解析JSON的库有很多,但能编码的就比较少。其中比较方便好用的就是JSONCPP,但它肯定不是速度最快的。另外CB本身也带了一个JSON的编码解码库。
roy655 2014-09-09
  • 打赏
  • 举报
回复
引用 4 楼 ybchen 的回复:
按照这个规则,这里的 std::string 和 UTF8String 都是 UTF-8 编码的,没有 ANSI,如果把 std::string 和 char * 之间转换,把 UTF8String 和 char * 之间转换,都是 UTF-8 编码的。程序里面一旦出现 ANSI 编码,就会出错。
谢谢各位大大的指点,我看了解释我也明白了,但是有个问题,这个jsoncpp参数格式都固定死了的,我改了的话编译不过去,只能改jsoncpp的源码,但是本人能力有限可能做不到这些,我就想问问,是不是这就是jsoncpp的一个bug,我怎么能简单一点解决这个问题。c++builder里面好像解析json的就只能用这个jsoncpp。
缘中人 2014-09-09
  • 打赏
  • 举报
回复
那最终传入传出的都是 UnicodeString 了
  • 打赏
  • 举报
回复
jsoncpp 可以参考这个程序,支持 UNICODE 的,世界各国语言都支持,不仅仅是汉字。 http://www.cppfans.com/sdk/json/jsoncpp.asp
  • 打赏
  • 举报
回复
按照这个规则,这里的 std::string 和 UTF8String 都是 UTF-8 编码的,没有 ANSI,如果把 std::string 和 char * 之间转换,把 UTF8String 和 char * 之间转换,都是 UTF-8 编码的。程序里面一旦出现 ANSI 编码,就会出错。
  • 打赏
  • 举报
回复

                wchar_t *            wchar_t *
                     ↘               ↙↗
std::string  ←→  UTF8String  ←→  UnicodeString
                     ↗                ↖
               L"字符串"            L"字符串"
  • 打赏
  • 举报
回复
JasonCpp 在处理 UTF-8 编码的字符串的时候是没有问题的,由于 ANSI 编码太过复杂,缺点太多,很多函数处理都会出错,JasonCpp 无法处理 AnsiString 是可以理解的。 用 UTF8String 代替 AnsiString,字符串一律用 UNICODE 就没问题了,避免任何地方都不要有 ANSI 出现,字符串常数也要写成 L"" 这样的 UNICODE 字符串。 UTF8String sJson = L“xxxxxx”; UTF8String 和 UnicodeString 之间可以直接互相赋值 UTF8String 和 std::string 之间可以直接互相赋值 std::string 和 UnicodeString 之间需要用 UTF8String 中转

                   wchar_t *                              wchar_t *   
                             ↘                                    ↙↗
std::string  ←→  UTF8String  ←→  UnicodeString
                             ↗                                     ↖
                   L"字符串"                              L"字符串"
按照这个规则,这里的 std::string 和 UTF8String 如果和 char* 互相转换,就是 UTF-8 编码的,没有 ANSI
sczyq 2014-09-03
  • 打赏
  • 举报
回复
AnsiString 改成 UnicodeString json 确实麻烦的事, 或者可能要使用字符串解码器 TEncoding

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧