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\"}]";