• 9708阅读
  • 15回复

qjson [复制链接]

上一主题 下一主题
离线hover_sky
 

只看楼主 倒序阅读 楼主  发表于: 2010-01-21
qjson
— 本帖被 XChinux 执行加亮操作(2010-01-26) —
os:xp

qt:4.6.0

qjson:0.7.1

问题描述:只要我在程序中加了QJson::Parser parser;都是异常退出:
                    exited with code -1073741510


用过qjson的指导一下吧?谢谢了
离线XChinux

只看该作者 1楼 发表于: 2010-01-21
我用tinyjson,基于boost库的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 2楼 发表于: 2010-01-21
引用第1楼XChinux于2010-01-21 13:14发表的  :
我用tinyjson,基于boost库的。


支持中文编码么?

要带boost库,程序很大吧?
离线XChinux

只看该作者 3楼 发表于: 2010-01-21
引用第2楼hover_sky于2010-01-21 13:16发表的  :
支持中文编码么?
要带boost库,程序很大吧?


好像不需要吧,代码都在.hpp中了,如果需要并且用VC编译的话,VC自己会进行链接的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 4楼 发表于: 2010-01-21
引用第3楼XChinux于2010-01-21 17:48发表的  :
好像不需要吧,代码都在.hpp中了,如果需要并且用VC编译的话,VC自己会进行链接的。


.hpp 文件不是需要boost支持嘛?要先编译boost吧?

到一台新电脑发布程序,要带boost库吧?
[ 此帖被hover_sky在2010-01-21 22:17重新编辑 ]
离线hover_sky

只看该作者 5楼 发表于: 2010-01-21
真晕,有网页提到编译boost要2小时
离线hover_sky

只看该作者 6楼 发表于: 2010-01-23
版主大人,您的tinyjson是怎么处理中文的?
离线XChinux

只看该作者 7楼 发表于: 2010-01-26
boost使用时要根据自己使用的库的情况来确定到底是否要编译,要编译哪些库,并不需要所有的都编译。
boost中有些库是需要编译的,有些则能直接用(模板库嘛,都在.hpp中了)。

在tinyjson 官网上有示例可看。
下面是我使用的一段代码:

void Session::parse(const QByteArray &message)
{
    using namespace std;
    QStringList slData;
    try
    {
        string str(message.data());
        json::grammar<char>::variant var = json::parse(str.begin(), str.end());
        if (var->empty() || var->type() != typeid(json::grammar<char>::object))
        {
           qDebug() << "[EXCEPTION]\t" << "var is not a object"
                    << var->type().name();
            return;
        }
        json::grammar<char>::object const &obj =
            boost::any_cast<json::grammar<char>::object>(*var);
        for (json::grammar<char>::object::const_iterator it = obj.begin();
                it != obj.end(); ++it)
        {
            if (it->first == "data")
            {
                json::grammar<char>::array &a =
                    boost::any_cast<json::grammar<char>::array>(*(it->second));
                string v;
                int cnt = a.size();
                for (int i = 0; i < cnt; i++)
                {
                    v = boost::any_cast<string>(*a);
                    slData << QString::fromUtf8(v.c_str());
                }
            }
        }
    }
    catch (exception &e)
    {
        qDebug() << e.what();
    }
    catch (...)
    {
        qDebug() << "parse data error";
    }
    if (!slData.isEmpty())
    {
        emit dataReceived(slData);
    }
}

以上代码解析的是{"data":["str1","str2","str3"]}样式的结构,服务器端是PHP(UTF-8)的,型如:json_encode(array("data" => array("str1", "str2", "str3)))
[ 此帖被XChinux在2010-01-26 09:43重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 8楼 发表于: 2010-01-26
谢谢版主的代码,不过您的代码在我这里(qt4.6)编译不过哦


  1. QByteArray temp = reply->readAll();
  2.         QString replyData(temp);
  3.         //string strJson=replyData.toStdString();
  4.         string strJson=replyData.toStdString();
  5.         QStringList slData;
  6.         try
  7.         {
  8.             grammar<char>::variant var = parse(strJson.begin(), strJson.end());
  9.             if(var->type() != typeid(grammar<char>::object))
  10.             {
  11.                 return;
  12.             }
  13.             grammar<char>::object const& obj = boost::any_cast<grammar<char>::object>(*var);
  14.             for(grammar<char>::object::const_iterator it = obj.begin(); it != obj.end(); ++it)
  15.             {
  16.                 if((*it).first=="result")
  17.                 {
  18.                     if((*it).second->type() == typeid(grammar<char>::array))
  19.                     {
  20.                         //这是一个数组类型,下面循环解析里面所有的元素
  21.                         grammar<char>::array const & a = boost::any_cast<grammar<char>::array>(*(*it).second);
  22.                         for(grammar<char>::array::const_iterator ita = a.begin(); ita != a.end(); ++ita)
  23.                         //int cnt = ita.size();
  24.                         //for (int i = 0; i < cnt; i++)
  25.                         {
  26.                             if((*ita)->type() == typeid(int))
  27.                             {
  28.                                 int nValue = boost::any_cast<int>(*(*ita));    //这里会读到每一个数组元素
  29.                                 //qDebug()<<nValue<<endl;
  30.                                 slData<<QString::number(nValue);
  31.                             }
  32.                             if((*ita)->type() == typeid(std::string))
  33.                             {
  34.                                 string nValue = boost::any_cast<std::string>(*(*ita));    //这里会读到每一个数组元素
  35.                                 slData<<QString::fromUtf8(nValue.c_str());
  36.                             }
  37.                           }
  38.                         }
  39.                     }
  40.             }
  41.         }
  42.         catch (exception &e)
  43.         {
  44.                qDebug() << e.what();
  45.         }
  46.         catch (...)
  47.         {
  48.                qDebug() << "parse data error";
  49.         }
  50.         if (!slData.isEmpty())
  51.         {
  52.             qDebug()<<slData<<endl;
  53.         }



echo json_encode(array('result' => array(1,2,"您好,测试json中")));
离线XChinux

只看该作者 9楼 发表于: 2010-01-26
肯定过不了啊,需要boost及tinyjson.hpp
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 10楼 发表于: 2010-01-27
引用第9楼XChinux于2010-01-26 17:40发表的  :
肯定过不了啊,需要boost及tinyjson.hpp


版主,我的意思是您那段在我这里编译不通过,但我在8楼提供的那段代码是可以编译通过的。我已经编译好了boost,并包含了tingjson.hpp
离线XChinux

只看该作者 11楼 发表于: 2010-01-27
错误信息是什么?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 12楼 发表于: 2010-01-28
请看附件截图
离线hover_sky

只看该作者 13楼 发表于: 2010-02-04
请问坛主,tinjson怎么处理三层的数据?

如何{"1"->[2,3],"2"->{[3,4,5],[6,7]}}
离线XChinux

只看该作者 14楼 发表于: 2010-02-09
我的一个示例.pro文件:
TEMPLATE = app
TARGET =
DESTDIR = ../../bin
DEPENDPATH += .
INCLUDEPATH += .
MOC_DIR = tmp
OBJECTS_DIR = tmp
UI_HEADERS_DIR = tmp
QT += xml network
QT += webkit
CONFIG += release
CONFIG += console
win32:RC_FILE = main.rc
win32-msvc* {
    QMAKE_CXXFLAGS += -wd4100 -wd4503
    INCLUDEPATH += E:/Backup2/Boost/boost_1_40_0
}

unix {
    INCLUDEPATH += /mnt/hd/backup/boost_1_40_0
}

# Input
HEADERS += MainWindow.hpp \
        Session.hpp \
        SessionThread.hpp \
        LoginDialog.hpp \
        Common.hpp
HEADERS += CTWebSystemForm.hpp
FORMS += MainWindow.ui \
        LoginDialog.ui
FORMS += CTWebSystemForm.ui
SOURCES += main.cpp \
        MainWindow.cpp \
        Session.cpp \
        SessionThread.cpp \
        LoginDialog.cpp \
        Common.cpp
SOURCES += CTWebSystemForm.cpp
RESOURCES += main.qrc
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hover_sky

只看该作者 15楼 发表于: 2010-02-10
谢谢了

不过,我现在改用jsoncpp了。挺好用的
快速回复
限100 字节
 
上一个 下一个