各QJson类型之间及与QString的相互转换

转自个人博客

闲来无事,总结一下这四种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::Boolbool
    QJsonValue::Doubledouble
    QJsonValue::StringQString
    QJsonValue::ArrayQJsonArray
    QJsonValue::ObjectQJsonObject
    QJsonValue::NullNULL

    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()){/// 1QJsonDocument doc1(value.toObject());  /// 2QJsonDocument doc2 = QJsonDocument(value.toObject()); 
    }else if(value.isArray()){/// 1QJsonDocument doc1(value.toArray());  /// 2QJsonDocument 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());