1. qjson怎样和通信结合起来用
C的#是什么?C#?
Json只是规定了数据格式的字符串,和语言间通信没什么关系。
如果你说的通信是两个程序的通信,那就用网络TCP,socket什么的,或者用进程间通信(同一个电脑才行),网络通信自然要有格式,通信传的是字节数据,要通信双方约定好什么字节序列代表什么。随便假设一个,客户端向服务器登入的:A程序向B程序发送“login:id=??:password=??",命令用“:”隔开,B收到信息后,根据第一个命令login确定A是要登入,再读取之后的id和password判断是否正确等等,最后返回信息给A,告诉它是否登入成功,比如登入成功发送"loginsuccess",失败发送"loginfailed",A根据返回的信息判断是否成功。Json是个格式,java和C#应该都有读取其的类库,但还是要自己规定什么字段表示什么,比如登入需要order=login,并且有id和password:{order=login;id=??;password=??;} 忘记要不要加冒号了。
如果是Java语言调用C#函数或C#语言调用Java函数,那就和Json没有一点关系,直接网络吧,网络网页应该就能找到。
2. java怎么实现JSON打包UDP
java实现JSON打包UDP cJSON支持在C程序中创建和解析JSON数据,其提供多种方法供C程序使用,最直接的是将cJSON.c和cJSON.h加入到C工程中
(1) QJsonObject用于在Qt中创建JSON对象
(2)数据传输通过UDP运行
3. qt 怎样把c++ json 加到qt
主要处理tcp的json数据流,解析和除错json数据流,继承与 qtcpsocket层,方便扩展
数据流格式:
[cpp] view plain在CODE上查看代码片派生到我的代码片
#ifndef CONFIGTCPSOCKET_H
#define CONFIGTCPSOCKET_H
#include <QTcpSocket>
#include <QJsonDocument>
class JsonTcpSocket : public QTcpSocket
{
Q_OBJECT
public:
explicit JsonTcpSocket(QObject *parent = 0);
virtual ~JsonTcpSocket();
const QString &getLastError()const{return lastErrorString;}
const int &getLastCode()const{return lastErrorCode;}
public slots:
bool write(const char *json);
bool write(const QJsonDocument &json);
bool write(const QByteArray &json);
bool write(const QString &json);
bool write(const QJsonObject &obj);
signals:
void newJsonData(const QJsonDocument &doc);//新的json数据
void jsonError(const int &errorCode,const QString &errorString);//json格式错误
void socketError(const int &errorCode,const QString &errorString);//网络错误
private slots:
void readBytes();//读取字节
void networkError(QAbstractSocket::SocketError error);//网络错误
private:
int readByteCount=0;
QString lastErrorString; //最后的错误文字
int lastErrorCode;//错误代码
};
#endif // CONFIGTCPSOCKET_H
[cpp] view plain在CODE上查看代码片派生到我的代码片
#include "jsontcpsocket.h"
#include <QDataStream>
#include "settingconfig.h"
#include <QByteArray>
#include <QThread>
#include "commonfunction.h"
JsonTcpSocket::JsonTcpSocket(QObject *parent) :
QTcpSocket(parent)
{
connect(this,&JsonTcpSocket::readyRead,this,&JsonTcpSocket::readBytes);
connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(networkError(QAbstractSocket::SocketError)));
this->setSocketOption(QAbstractSocket::LowDelayOption,"1"); //启用nagle低延迟算法
this->setSocketOption(QAbstractSocket::KeepAliveOption,"1"); //设置保持连接状态
}
JsonTcpSocket::~JsonTcpSocket()
{
}
void JsonTcpSocket::readBytes()//读取字节
{
if(this->readByteCount==0)
{
char peek;
this->read(&peek,sizeof(peek));
if(peek=='l') //查看是否是数据包的起始位置
{
char len[READ_RAW_LEN];//读取json数据的长度
this->read(len,sizeof(len));
ByteToInt(len,&this->readByteCount);
}else //否则就丢弃全部的数据
{
this->readAll();
//qDebug()<<"read all data:"<<this->readAll();
return;
}
}
if(this->readByteCount>this->bytesAvailable())
return;
char *json=new char[this->readByteCount];
this->read(json,this->readByteCount); //读取json数据
this->readByteCount=0; //数据长度重设为0;
QJsonParseError parseError;
QJsonDocument jsonDoc(QJsonDocument::fromJson(json,&parseError));
if(parseError.error==QJsonParseError::NoError) //json格式是否正确
{
// qDebug()<<"read json data:"<<jsonDoc.toJson();
emit newJsonData(jsonDoc); //发送json数据信号
}
else
{
this->lastErrorCode=parseError.error;
this->lastErrorString=parseError.errorString();
emit jsonError(parseError.error,parseError.errorString()); //发送错误代码
qDebug()<<"json format error:"<<json;
}
delete []json;
this->readBytes(); //继续读取一下段数据
}
bool JsonTcpSocket::write(const char *json)
{
return this->write(QJsonDocument::fromJson(json));
}
bool JsonTcpSocket::write(const QByteArray &json)
{
return this->write(QJsonDocument::fromJson(json));
}
bool JsonTcpSocket::write(const QString &json)
{
return this->write(QJsonDocument::fromVariant(json));
}
bool JsonTcpSocket::write(const QJsonObject &obj)
{
return this->write(QJsonDocument(obj));
}
bool JsonTcpSocket::write(const QJsonDocument &json)
{
QByteArray array;
array.prepend(json.toJson(QJsonDocument::Compact));
int len=array.length();
char lenByte[READ_RAW_LEN];
IntToByte(len,lenByte);
array.prepend(lenByte,sizeof(lenByte));
array.prepend('l');
int bytes=-1;
bytes=QTcpSocket::write(array);
return bytes!=-1;
}
void JsonTcpSocket::networkError(QAbstractSocket::SocketError error)//网络错误
{
this->lastErrorString=this->errorString();
this->lastErrorCode=error;
emit socketError(error,this->lastErrorString);
}
4. 请教QT 解析 json 的问题
解析的主要步骤如下:
1,将来源数据转化为JsonDocument。可用它的构造函数,或setArray、setObject,或它的静态成员函数。
2,可用下列四函数判断它的最外层数据类型(一般是个对象):
bool isArray() const
bool isEmpty() const
bool isNull() const
bool isObject() const
3,知道类型后,用以下函数将它转化为json对象或json数组或Map
QJsonArray array() const
QJsonObject object() const
QVariant toVariant() const
一般方法
// 1. 创建 QJsonParseError 对象,用来获取解析结果
QJsonParseError error;
// 2. 使用静态函数获取 QJsonDocument 对象
QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toUtf8(), &error);
// 3. 根据解析结果进行处理
if (error.error == QJsonParseError::NoError) {
if (!(jsonDocument.isNull() || jsonDocument.isEmpty())) {
if (jsonDocument.isObject()) {
// ...
} else if (jsonDocument.isArray()) {
// ...
}
}
} else {
// 检查错误类型
}
5. Qt如何将对象转换为JSON格式的
自动转肯定是不可能了,要自己写代码。
qt5的话可以直接用QJsonDocument、QJsonObject、QJsonValue、QJsonArray,
qt4.8的话建议去网上找一个开源的json类来用
6. Qt中如何解析Json数据
有这几个类可以处理 Json 数据:QJsonDocument、QJsonObject、QJsonValue
7. Qt的QJsonDocument在linux下不能用
某些库在linux之下是没有的。
8. QJsonDocument在QT4种能用什么替代
没有替代,但是既然是新出的,并且有源代码,可以修改下拿过来用
9. 请教Qt如何解析出Json的数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
常用的Json库
JsonCpp
JsonCpp是一个C++用来处理JSON数据的开发包。
网址:http://jsoncpp.sourceforge.net/.
cJSON
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
网址:http://sourceforge.net/projects/cjson/.
QJson
QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,JSON的数组将被映射为QVariantList实例,而其他对象映射为QVariantMap实例。
网址:http://qjson.sourceforge.net/.
关于Qt中对JSON的生成与解析,Qt5以前的版本,需要去进行单独下载、编译,才能使用。到了Qt5,提供了专门的QJsonDocument类来读取和写入JSON文档。
Qt5中JSON的生成与解析
QJsonDocument
QJsonDocument既可以从一个基于文本表示的UTF-8编码,又可以从Qt自己的二进制格式读取和写入这个文件。
JSON文档可以从它的基于文本的表示使用QJsonDocument::fromJson()转换为QJsonDocument,用.toJSON()将其转换回文字。解析器非常快速和高效,将JSON转换为二进制表示。
QJsonObject
QJsonObject类用于封装JSON对象。
JSON对象是键值对,其中键是唯一的字符串,其值由QJsonValue代表。一个QJsonObject可以从QVariantMap转换/被转换。
QJsonArray
QJsonArray类用于封装JSON数组。
一个JSON数组列表值。该列表可以通过从阵列插入和移除QJsonValue的操纵。一个QJsonArray可以从QVariantList转换为/被转换。
QJsonDocument有效解析后的文档可以使用!iSNull()判断。使用isArray()和isObject()来判断是否包含一个数组或对象。文档中包含的数组或对象可以使用array()或object()进行检索,然后读取或操纵。
示例
QJsonObject
(1)生成Json
QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str:{"name": "Qt","version": 5,"windows": true}
(2)解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj.take("name");
if(name_value.isString())
{
QString name = name_value.toString();
}
}
if(obj.contains("version"))
{
QJsonValue version_value = obj.take("version");
if(version_value.isDouble())
{
int version = version_value.toVariant().toInt();
}
}
if(obj.contains("windows"))
{
QJsonValue version_value = obj.take("windows");
if(version_value.isBool())
{
bool flag = version_value.toBool();
}
}
}
}
结果:
name:Qt
version:5
windows:true
QJsonArray
(1)生成Json
QJsonArray json;
json.insert(0, QString("Qt"));
json.insert(1, QString("version"));
json.insert(2, true);
QJsonDocument document;
document.setArray(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QString json_str(byte_array);
结果:
json_str:["Qt","version",true]
(2)解析Json
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i
{
QJsonValue value = array.at(i);
if(value.isString())
{
QString name = value.toString();
}
else if(value.isBool())
{
bool flag = value.toBool();
}
}
}
}
结果:
数组不同下标对应的值
0:Qt
1:version
2:true
如上,简单介绍一下常用的JSON库以及Qt中对JSON的生成与解析,如需更多资料请参考官方文档,还是那句话,没有比助手更好、更专业的资料了!
10. 在Qt中如何通过QJson 解析json数据
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array) 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。 基础示例1.JSON 表示名称 / 值对的方式按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对": < code>{ "firstName": "Brett" } </code> 这个示例非常基本,而且实际上比等效的纯文本"名称 / 值对"占用更多的空间: firstName=Brett 但是,当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如: { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }从语法方面来看,这与"名称 / 值对"相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系. 2 表示数组当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。如果使用 JSON,就只需将多个带花括号的记录分组在一起: { "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ]}这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录): { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] } QJson QJson是一个基于Qt的开发包用来将JSON数据解析成QVariant对象,Json 数组讲被映射成QVariantList实例,其他对象映射为QVariantMap实例 代码实现 设置pro文件 LIBS += -lqjson引入头文件 #include <qjson/parser.h>代码中使用 QJson::Parser QJson::Parser parser;bool ok;QString query = "[{\"rid\":\"102432\", \"pid\":\"1000\", \"username\":\"dxy\"},{\"rid\":\"000\", \"pid\":\"10200\", \"username\":\"dxy2\"}]";