测试它是Qt中的QJsonObject还是QJsonArray

时间:2018-10-01 11:29:13

标签: c++ qt qt5

我应该从服务器收到一个QJsonObject,该服务器将包含一个名称为“ List”的QJsonObjectQJsonArray。我的意思是,“列表”可以是QJsonObjectQJsonArray。那么如何检查“列表”是QJsonObject还是QJsonArray

收到的QJsonDocument可能是以下两种波纹写格式之一

1)这里的“列表”是QJsonArray

{
  "Data":
         {
           "List":
             [
                {
                   "name": "something",
                   "id": "number"
                },
                {
                   "name": "something",
                   "id": "number"
                },
                {
                   "name":"something",
                   "id": "number"
               }
            ] 
        } 
}

2)这里的“列表”是QJsonObject

{
   "Data":
          {
            "List":
               {
                  "name": "something",
                  "id": "number"
               }
          }
}

先谢谢了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

第一个采样的json无效,因此我将等待您更正它以指出正确的测试,而第二个仅缺少逗号。但是,当您访问watchCurrentLocation() { getCurrentPositionTimeoutHandle = setTimeout(() => { // first try with without enableHighAccuracy navigator.geolocation.getCurrentPosition( (position) => { console.log("get user location with setTimeout 1"); const passengerInfo = { latitude: position.coords.latitude, longitude: position.coords.longitude } this.updatePassengerCoordinates(passengerInfo); if (getCurrentPositionTimeoutHandle) { console.log("Timeout function exist so call that again 2"); this.watchCurrentLocation(); } }, (error) => { console.log("Error while getting Current Location : ", error); //console.log("Error while executing timeout way method 3"); this.watchCurrentLocation() }, { timeout: 20000, maximumAge: 0 }); }, 3000); } QJsonObject的字段时,它会返回一个QJsonArray,它是处理多种类型数据的助手,并且您知道它是否是一个QJsonValueRefQJsonObject,您必须使用方法isObject()isArray()

QJsonArray

输出:

const QByteArray json = R"(
                          {
                              "Data": {
                                  "List": {
                                      "name": "something",
                                      "id": "number"
                                  }
                              }
                          }
                          )";

QJsonDocument doc = QJsonDocument::fromJson(json);
QJsonObject obj = doc.object();
QJsonValueRef list_ref = doc["Data"].toObject()["List"];

if(list_ref.isObject())
    qDebug()<< list_ref <<"is Object";
else if (list_ref.isArray()) {
    qDebug()<< list_ref << "is array";
}

在第一个示例中,您想要显示以下有效的json:

QJsonValue(object, QJsonObject({"id":"number","name":"something"})) is Object

如果使用相同的方法,则会得到:

{
    "Data": {
        "List": [{
            "name": "something",
            "id": "number"
        }, {
            "name": "something",
            "id": "number"
        }, {
            "name": "something",
            "id": "number"
        }]
    }
}

答案 1 :(得分:0)

我假设您已经将服务器响应解析为有效的QJsonObject。使用QJsonValue QJsonObject::operator[](QString),我们检索到QJsonValue,它基本上是一种变体类型。您可以通过各种bool QJsonValue::is*()方法来查询值的类型。在您的情况下,您需要bool QJsonValue::isArray()bool QJsonIsObject()

auto dataNode = serverResponse["Data"];
if(dataNode.isObject()) {
  auto dataObject = dataNode.toObject();
  // handle object case
}
else if(dataNode.isArray()) {
  auto dataArray = dataNode.toArray();
  // handle array case
}