各QJson类型之间及与QString的相互转换
本文最后更新于 97 天前,其中的信息可能已经有所发展或是发生改变。

闲来无事,总结一下这四种QJson类型,包括QJsonObject、QJsonArray、QJsonValue、QJsonDocument,重点是记录一下这四种类型之间及与QString的相互转换,免得每次用到都要再搜一遍。

1. QJson类型介绍

Qt 提供了用于处理 JSON 数据的四种主要类型:

  • QJsonObject:表示一个 JSON 对象,JSON对象类似于键值对的字典,其有着指定的格式要求。

    JSON格式数据示例:

    {
      "姓名": "小美", 
      "年龄": 25,
      "性别": 女,
      "工作": ["律师", "漫画家"],
      "配偶": {
          "姓名": "小明", 
        "年龄": 26,
        "性别": 男,
        "工作": ["程序员", "小说家"]
      }
    }
  • QJsonArray:表示一个 JSON 数组,以数组形式存储QJsonValue对象,是一个有序列表,有着如同其他数组一样的方法操作元素。

    不仅存储QJsonObject对象,QJsonValue的各种类型都可以存储。

  • QJsonValue:表示一个通用 JSON 值,可以是JSON中的字符串、数字、布尔值、对象、数组或 null。QJsonObject的值都是QJsonValue类型的。

    QJsonValue类型 对应数据类型
    QJsonValue::Bool bool
    QJsonValue::Double double
    QJsonValue::String QString
    QJsonValue::Array QJsonArray
    QJsonValue::Object QJsonObject
    QJsonValue::Null NULL

    Qt提供了方法判断其类型以及转换方法,示例:

    QJsonValue value;
    if(value.isBool()){ // 使用is*()方法判断
      bool v = value.toBool(); // 使用to*()方法转换
      // ...
    }else if(value.isDouble()){
     double v = value.toDouble();
     // ...
    }else if(value.isString()){
      QString v = value.toString();
      // ...
    }else if(value.isArray()){
      QJsonArray array = value.toArray();
      // ...
    }else{
      // ...
    }
  • QJsonDocument:用于表示 JSON 文档,是 QJsonObject 和 QJsonArray 的包装类型,便于序列化和解析,也可以作为各QJson数据类型转换的中间数据类型

    Qt也提供了方法判断其类型以及转换方法,方法与QJsonValue有些不同,且只使用于QJsonObject和QJsonArray,示例:

    QJsonDocument doc;
    if(doc.isObject()){ // 使用is*()方法判断
      QJsonObject obj = doc.object(); // 使用*()方法转换,与QJsonValue不同
      // ...
    }else if(doc.isArray()){
     QJsonArray arr = value.array();
     // ...
    }

2. 各 QJson 类型之间的转换

2.1 QJsonObject 转换至其他类型

  • QJsonObject → QJsonArray:

    QJsonObject对象一般不能直接转为QJsonArray对象,就如同变量不会直接转为数组一样。要么将QJsonObject对象以一个元素的形式存入QJsonArray;要么将QJsonObject中某一个array格式的QJsonValue对象转为QJsonArray。

    QJsonObject obj;
    /// 1
    QJsonArray arr1{obj};
    /// 2
    QJsonArray arr2;
    arr2.append(obj);
    /// 3
    QJsonArray arr3 = obj["工作"].toArray();
  • QJsonObject → QJsonValue:

    QJsonObject是QJsonValue的类型之一,可以直接使用QJsonValue的构造函数转换。

    当然,因为QJsonObject的值都是QJsonValue类型的,所以一般使用情况都是取QJsonObject对象的值。

    QJsonObject obj;
    /// 1 
    QJsonValue value1(obj);
    /// 2
    QJsonValue value2 = QJsonValue(obj);
  • QJsonObject → QJsonDocument

    直接使用QJsonDocument的构造函数转换即可,注意其QJsonDocument::fromJson()方法不是针对QJsonObject的,是对于字节流的。

    QJsonObject obj;
    /// 1
    QJsonDocument doc1(obj);
    /// 2
    QJsonDocument doc2 = QJsonDocument(obj);

2.2 QJsonArray 转换至其他类型

  • QJsonArray → QJsonObject:

    QJsonArray对象一般不能直接转换为QJsonObject对象,要么取QJsonArray中的一个元素,要么以值的方式赋给QJsonObject对象的一个自定义key。

    QJsonArray arr;
    /// 1
    QJsonObject obj1 = arr[1];
    /// 2
    QJsonObject obj2["arr"] = arr;
  • QJsonArray → QJsonValue

    QJsonArray是QJsonValue的类型之一,可以直接使用QJsonValue的构造函数转换。

    当然,因为QJsonArray的元素都是QJsonValue类型的,所以一般使用情况都是取QJsonArray中的某一个元素。

    QJsonArray array;
    /// 1
    QJsonValue value1(array);
    /// 2
    QJsonValue value2 = QJsonValue(array);
  • QJsonArray → QJsonDocument

    直接使用QJsonDocument的构造函数隐式转换即可。

    QJsonArray array;
    /// 1
    QJsonDocument doc1(array);
    /// 2
    QJsonDocument doc2 = QJsonDocument(array);

2.3 QJsonValue 转换至其他类型

  • QJsonValue → QJsonObject

    使用QJsonValue封装的方法即可,使用前一般会判断一下。

    QJsonValue value;
    if(value.isObject()){
      QJsonObject obj = value.toObject();
    }
  • QJsonValue → QJsonArray

    使用QJsonValue封装的方法即可,使用前一般会判断一下。

    QJsonValue value;
    if(value.isArray()){
      QJsonArray array = value.toArray();
    }
  • QJsonValue → QJsonDocument:

    一般都是先转换为其他显式类型,再转换为QJsonDocument。

    QJsonValue value;
    if(value.isObject()){
      /// 1
      QJsonDocument doc1(value.toObject());  
      /// 2
      QJsonDocument doc2 = QJsonDocument(value.toObject()); 
    }else if(value.isArray()){
      /// 1
      QJsonDocument doc1(value.toArray());  
      /// 2
      QJsonDocument doc2 = QJsonDocument(value.toArray());  
    }
  • 转为基本类型(如字符串、数字、布尔值):

    使用QJsonValue封装的方法即可,使用前一般会判断一下。

    QJsonValue value;
    if(value.isString()){
      QString str = value.toString();
    }
    if(value.isDouble()){
      double num = value.toDouble();
    }
    if(value.isBool()){
      bool b = value.toBool();
    }

2.4 QJsonDocument 转换至其他类型

  • QJsonDocument → QJsonObject

    使用QJsonDocument封装的方法即可,使用前一般会判断一下。

    QJsonDocument doc;
    if(doc.isObject()){
      QJsonObject obj = doc.object();
    }
  • QJsonDocument → QJsonArray

    使用QJsonDocument封装的方法即可,使用前一般会判断一下。

    QJsonDocument doc;
    if(doc.isArray()){
      QJsonArray arr = doc.array();
    }
  • QJsonDocument → QJsonValue

    一般都是先转换为其他类型,再转换为QJsonValue。

    QJsonDocument doc;
    if(doc.isObject()){
      QJsonValue value(doc.object());
    }else if(doc.isArray()){
      QJsonValue value(doc.array());
    }

3. 各 QJson 类型与 QString 的转换

3.1 各 QJson 类型序列化至 QString

  • QJsonObject → QString:

    必须通过QJsonDocument中转,QJsonDococunment有toJson()方法将其序列化,然后再使用QString的方法转换为QString即可。

    QJsonObject obj;
    
    QJsonDocument doc(obj);
    QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
  • QJsonArray → QString:

    必须通过QJsonDocument中转,QJsonDococunment有toJson()方法将其序列化,然后再使用QString的方法转换为QString即可。

    QJsonArray array;
    
    QJsonDocument doc(array);
    QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
  • QJsonValue → QString:

    需先转为对应的其他类型再使用上述方法序列化。

    QJsonValue value;
    if(value.isObject()){
      QJsonDocument doc(value.toObject());
    QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
    }else if(value.isArray()){
      QJsonDocument doc(value.toArray());
    QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
    }
  • QJsonDocument → QString

    QJsonDococunment有toJson()方法将其序列化,然后再使用QString的方法转换为QString即可。

    参数最好指定QJsonDocument::Compact,用来压缩格式,使其成为紧凑格式,去掉字符串中系统自动添加的空格、换行符、缩减,对于多行输入的字符串能很好的规范格式。默认参数是QJsonDocument::Indented,被称为格式化(或美化)格式,不会做变动。

    QJsonDocument doc;
    QString jsonStr = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));

    注:如果需要转换为std::string类型,在toJson()序列化后,直接使用toStdString()方法即可

    QJsonDocument doc;
    std::string jsonStr = doc.toJson(QJsonDocument::Compact).toStdString();

3.2 QString 解序列化至各 QJson 类型

  • QString → QJsonObject

    必须通过QJsonDocument中转,使用QJsonDocument::fromJson()方法先转为QJsonDocument,再转为QJsonObject。

    字符串必须完全符合JSON格式,不然会转换失败。

    QString jsonStr = "..."; 
    QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());
    if(doc.isObject()){
      QJsonObject obj = doc.object();
    }
  • QString → QJsonArray

    必须通过QJsonDocument中转,使用QJsonDocument::fromJson()方法先转为QJsonDocument,再转为QJsonArray。

    QString jsonStr = "...";
    QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());
    if(doc.isArray()){
      QJsonArray array = doc.array();
    }
  • QString → QJsonValue

    要么先转为QJsonObject格式或QJsonArray格式,再转为QJsonValue;要么直接以赋值的形式,通过构造函数传入。

    QString jsonStr = "...";
    /// 1
    QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());
    if(doc.isObject()){
      QJsonValue value(doc.object());
    }else if(doc.isArray()){
      QJsonValue value(doc.array());
    }
    /// 2
    QJsonValue value(jsonStr);
  • QString → QJsonDocument

    使用QJsonDocument::fromJson()方法转换即可。

    QString jsonStr = "...";
    QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8());
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇