QT解析 JSON 格式的数据

QT解析 JSON 格式的数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 采用完全独立于语言的文本格式,这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

1、基础结构

  1. 名称/值对 集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object)、记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list),或者关联数组 (associative array)。

  2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

2、结构剖析

JSON 语法是 JavaScript 对象表示法语法的子集。

  • 数据在名称/值对中:如 "firstName": "John"
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

组成JSON的值可以为以下几种:

  • 数字(整数或浮点数)
  • 字符串(在双引号中)
  • 逻辑值(true 或 false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null

3、解析JSON

传统的 JSON 解析莫过于直接使用 java 中的方法,它通过原生的 JSONObjectJSONArray 来解析 json数据,下面我们就来解析这段 json 数据。json 数据如下:

{
  "code": "200",
  "location": [
    {
      "name": "北京",
      "id": "101010100",
      "lat": "39.90498",
      "lon": "116.40528",
      "adm2": "北京",
      "adm1": "北京市",
      "country": "中国",
      "tz": "Asia/Shanghai",
      "utcOffset": "+08:00",
      "isDst": "0",
      "type": "city",
      "rank": "10",
      "fxLink": "http://hfx.link/2ax1"
    },
    {
      "name": "海淀",
      "id": "101010200",
      "lat": "39.95607",
      "lon": "116.31031",
      "adm2": "北京",
      "adm1": "北京市",
      "country": "中国",
      "tz": "Asia/Shanghai",
      "utcOffset": "+08:00",
      "isDst": "0",
      "type": "city",
      "rank": "15",
      "fxLink": "http://hfx.link/2ay1"
    },
    {
      "name": "朝阳",
      "id": "101010300",
      "lat": "39.92148",
      "lon": "116.48641",
      "adm2": "北京",
      "adm1": "北京市",
      "country": "中国",
      "tz": "Asia/Shanghai",
      "utcOffset": "+08:00",
      "isDst": "0",
      "type": "city",
      "rank": "15",
      "fxLink": "http://hfx.link/2az1"
    }
  ],
  "refer": {
    "sources": [
      "qweather.com"
    ],
    "license": [
      "commercial license"
    ]
  }
}

首先,能够看到最外边是一个大括号,我们可以直接从传过来的 json 字符串创建出来 jsonObject 对象,然后可以通过它获取 code 属性所对应的值,代码如下:

// 根据解析出来的JSON,创建具体的 JSONObject对象
QJsonObject jsonObject = Utf8Text.object();
QString codeData = jsonObject["code"].toString();

接下来,我们能够看到 "location" 所对应的值为一个 JSONArray 数组。那么,我们可以将 "location" 所对应的值提取出来,然后将其转换成 JSONArray 数组,代码如下:

// 将 "location" 对应的值提取出来
QJsonValue locationValue = jsonObject.value(QStringLiteral("location"));
// qDebug() << locationValue;
// 根据 JSON 文件可知,"location"对应值的类型为数组类型
// 将其转换为数组类型
QJsonArray locationValueArray = locationValue.toArray();

紧接着,我们可以通过 QJsonArray::at(i) 函数获取数组下的第 i 个元素,同时每一个元素即是一个 jsonObject对象,我们再利用 QJsonValue::toObject() 函数将每一个数组元素转换成 Object 对象,代码如下:

for (int i = 0; i < locationValueArray.size(); i++)
{
    // 通过 QJsonArray::at(i)函数获取数组下的第i个元素
    QJsonValue locationArray = locationValueArray.at(i);
    // qDebug() << locationArray;
    // 通过 QJsonValue::toObject()函数将数组元素转换成Object对象
    QJsonObject location = locationArray.toObject();
}

最后,我们便可以获取每一个对象的属性,代码如下:

QString Lng = location["lon"].toString();
QString lat = location["lat"].toString();

你可能感兴趣的:(#,QT,json,qt)