Qt5에서 JSON 파일을 작성/읽기/기입하는 방법
Qt5에 새로운 JSON 파서가 있어서 사용하고 싶습니다.문제는 그 함수가 평신도들의 용어로 무엇을 하고 어떻게 코드를 작성해야 하는지가 너무 명확하지 않다는 것이다.그렇지 않으면 내가 잘못 읽었을 수도 있어.
Qt5에서 JSON 파일을 작성하는 코드와 "encapsules"의 의미를 알고 싶습니다.
예: 파일에서 json 읽기
/* test.json */
{
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}
void readJson()
{
QString val;
QFile file;
file.setFileName("test.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
val = file.readAll();
file.close();
qWarning() << val;
QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
QJsonObject sett2 = d.object();
QJsonValue value = sett2.value(QString("appName"));
qWarning() << value;
QJsonObject item = value.toObject();
qWarning() << tr("QJsonObject of description: ") << item;
/* in case of string value get value and convert into string*/
qWarning() << tr("QJsonObject[appName] of description: ") << item["description"];
QJsonValue subobj = item["description"];
qWarning() << subobj.toString();
/* in case of array get array and convert into string*/
qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"];
QJsonArray test = item["imp"].toArray();
qWarning() << test[1].toString();
}
산출량
QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) )
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})
"QJsonObject[appName] of description: " QJsonValue(string, "Home")
"Home"
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) )
"best"
예: 문자열에서 json 읽기
다음과 같이 json을 문자열에 할당하고readJson()
앞에 표시된 함수:
val =
' {
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}';
산출량
QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) )
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})
"QJsonObject[appName] of description: " QJsonValue(string, "Home")
"Home"
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) )
"best"
QT의 JSON은 사실 꽤 유쾌하다 - 나는 놀랐다.다음 예에서는 어떤 구조를 가진 JSON 출력을 작성하는 방법을 보여 줍니다.
필드의 의미를 설명하지 않은 점 양해 바랍니다.이것은 Ham Radio 프로세싱 출력 스크립트입니다.
이것은 QT C++ 코드입니다.
void CabrilloReader::JsonOutputMapper()
{
QFile file(QDir::homePath() + "/1.json");
if(!file.open(QIODevice::ReadWrite)) {
qDebug() << "File open error";
} else {
qDebug() <<"JSONTest2 File open!";
}
// Clear the original content in the file
file.resize(0);
// Add a value using QJsonArray and write to the file
QJsonArray jsonArray;
for(int i = 0; i < 10; i++) {
QJsonObject jsonObject;
CabrilloRecord *rec= QSOs.at(i);
jsonObject.insert("Date", rec->getWhen().toString());
jsonObject.insert("Band", rec->getBand().toStr());
QJsonObject jsonSenderLatObject;
jsonSenderLatObject.insert("Lat",rec->getSender()->fLat);
jsonSenderLatObject.insert("Lon",rec->getSender()->fLon);
jsonSenderLatObject.insert("Sender",rec->getSender_call());
QJsonObject jsonReceiverLatObject;
jsonReceiverLatObject.insert("Lat",rec->getReceiver()->fLat);
jsonReceiverLatObject.insert("Lon",rec->getReceiver()->fLon);
jsonReceiverLatObject.insert("Receiver",rec->getReceiver_call());
jsonObject.insert("Receiver",jsonReceiverLatObject);
jsonObject.insert("Sender",jsonSenderLatObject);
jsonArray.append(jsonObject);
QThread::sleep(2);
}
QJsonObject jsonObject;
jsonObject.insert("number", jsonArray.size());
jsonArray.append(jsonObject);
QJsonDocument jsonDoc;
jsonDoc.setArray(jsonArray);
file.write(jsonDoc.toJson());
file.close();
qDebug() << "Write to file";
}
내부 QT 구조(CabrilloRecord 객체에 대한 포인터 목록...)가 필요합니다.무시만 하면 됩니다).그리고 일부 필드를 추출합니다.그런 다음 이러한 필드는 다음과 같이 중첩된 JSON 형식으로 출력됩니다.
[
{
"Band": "20",
"Date": "Sat Jul 10 12:00:00 2021",
"Receiver": {
"Lat": 36.400001525878906,
"Lon": 138.3800048828125,
"Receiver": "8N3HQ "
},
"Sender": {
"Lat": 13,
"Lon": 122,
"Sender": "DX0HQ "
}
},
{
"Band": "20",
"Date": "Sat Jul 10 12:01:00 2021",
"Receiver": {
"Lat": 36.400001525878906,
"Lon": 138.3800048828125,
"Receiver": "JA1CJP "
},
"Sender": {
"Lat": 13,
"Lon": 122,
"Sender": "DX0HQ "
}
}]
나는 이것이 이 주제에 대한 다른 사람의 진행을 가속화하기를 바란다.
안타깝게도 많은 JSON C++ 라이브러리는 사용하기 쉬운 API를 가지고 있지만 JSON은 사용하기 쉬운 API를 가지고 있습니다.
위의 답변 중 하나에 표시된 JSON 문서의 gSOAP 툴에서 jsoncpp을 실행해 보았습니다.이 코드는 JSON 객체를 C++에 구축하기 위해 jsoncpp에서 생성된 코드입니다.이 코드는 JSON 형식으로 std:cout에 기술됩니다.
value x(ctx);
x["appDesc"]["description"] = "SomeDescription";
x["appDesc"]["message"] = "SomeMessage";
x["appName"]["description"] = "Home";
x["appName"]["message"] = "Welcome";
x["appName"]["imp"][0] = "awesome";
x["appName"]["imp"][1] = "best";
x["appName"]["imp"][2] = "good";
std::cout << x << std::endl;
std::cin에서 JSON을 해석하고 값을 추출하기 위해 jsoncpp에 의해 생성된 코드입니다(치환).USE_VAL
필요한 경우) :
value x(ctx);
std::cin >> x;
if (x.soap->error)
exit(EXIT_FAILURE); // error parsing JSON
#define USE_VAL(path, val) std::cout << path << " = " << val << std::endl
if (x.has("appDesc"))
{
if (x["appDesc"].has("description"))
USE_VAL("$.appDesc.description", x["appDesc"]["description"]);
if (x["appDesc"].has("message"))
USE_VAL("$.appDesc.message", x["appDesc"]["message"]);
}
if (x.has("appName"))
{
if (x["appName"].has("description"))
USE_VAL("$.appName.description", x["appName"]["description"]);
if (x["appName"].has("message"))
USE_VAL("$.appName.message", x["appName"]["message"]);
if (x["appName"].has("imp"))
{
for (int i2 = 0; i2 < x["appName"]["imp"].size(); i2++)
USE_VAL("$.appName.imp[]", x["appName"]["imp"][i2]);
}
}
이 코드는 gSOAP 2.8.28의 JSON C++ API를 사용합니다.저는 사람들이 라이브러리를 바꿀 것이라고는 생각하지 않지만, 이 비교는 JSON C++ 라이브러리를 보는 데 도움이 된다고 생각합니다.
그것을 어떻게 사용하는지 예를 들면 좋을 것 같습니다.QT 포럼에는 몇 가지 예가 있지만, 공식 문서를 확장해야 한다는 당신의 의견은 옳습니다.
QJsonDocument
그것만으로는 아무것도 얻을 수 없기 때문에, 거기에 데이터를 추가할 필요가 있습니다.이것은, 를 통해서 행해집니다.QJsonObject
,QJsonArray
그리고.QJsonValue
반.최상위 항목은 배열 또는 개체여야 합니다(이유는1
는 유효한 json 문서가 아닙니다.{foo: 1}
입니다.)
언급URL : https://stackoverflow.com/questions/15893040/how-to-create-read-write-json-files-in-qt5
'source' 카테고리의 다른 글
Mongoose 문서를 json으로 변환 (0) | 2023.03.16 |
---|---|
TypeScript 컴파일러가 tsconfig.json을 무시하는 이유는 무엇입니까? (0) | 2023.03.16 |
Redux 상태가 변경되었습니다. React가 재렌더를 트리거하지 않는 이유는 무엇입니까? (0) | 2023.03.16 |
수집되지 않은 DOMException:'set'을 실행하지 못했습니다.'스토리지'의 항목:'도메인' 값 설정이 할당량을 초과했습니다. (0) | 2023.03.16 |
AngularJS의 디렉티브에 서비스를 삽입할 수 있습니까? (0) | 2023.03.16 |