QJsonDocument::array() 和 QJsonDocument::object()

Posted

技术标签:

【中文标题】QJsonDocument::array() 和 QJsonDocument::object()【英文标题】:QJsonDocument::array() and QJsonDocument::object() 【发布时间】:2016-08-05 07:30:42 【问题描述】:

我正在阅读QJsonDocument documentation 并使用QJsonDocument 与以下行:

emit this->ueSignalNewDataArrivedPlaces(QJsonDocument::fromBinaryData(incomingData[0].toByteArray()));

我不明白,在这行之后,我应该使用 QJsonDocument::array()还是QJsonDocument::object(),即QJsonDocument在什么情况下创建array以及在什么情况下创建object

【问题讨论】:

【参考方案1】:

一个JSON数组是一个有序列表,写成:

[ <item1>, <item2>, <item3> ]

而 JSON 对象是一个命名列表,写成:


    <name1>: <item1>,
    <name2>: <item2>

在 Qt 中,QJsonArray 等效于 QVariantList (QList&lt;QVariant&gt;),QJsonObject 等效于 QVariantMap (QMap&lt;QString, QVariant&gt;)。

你必须使用哪一个取决于你正在解析的文件。 以***为例:


  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": 
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  ,
  "phoneNumbers": [
    
      "type": "home",
      "number": "212 555-1234"
    ,
    
      "type": "office",
      "number": "646 555-4567"
    ,
    
      "type": "mobile",
      "number": "123 456-7890"
    
  ],
  "children": [],
  "spouse": null

您可以使用QJsonArray 来获取phoneNumbers 的列表,phoneNumbers 的每个元素都是一个QJsonObject,带有两个命名值:typenumber

如果在您的代码中您需要操作 JSON 元素但您不知道它的类型,您可以使用 QJsonValue,它是以下之一:QJsonObjectQJsonArraybooldoubleQString

【讨论】:

嗯,就是这样!如果json 数据源仅包含“一条记录”,我认为创建QJsonObject 而不是QJsonArray 如果isObject()isArray() 都返回true,我可以确定“无效”json 格式吗? @Kernelpanic 您不能同时返回 true。您的根元素不能既是数组又是对象。如果你想要证明,在 Qt 源代码中 QJsonDocument::isArray() 调用 QJsonPrivate::Base::isArray(),它被实现为内联 bool isArray() const return !isObject(); 。您还可以使用QJsonDocument::isNull()QJsonDocument::fromJson() 的第二个参数检查无效的JSON。

以上是关于QJsonDocument::array() 和 QJsonDocument::object()的主要内容,如果未能解决你的问题,请参考以下文章

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()

malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理