今趣味で書いているプログラムの保存形式をどうしようか悩んでいたのだが、 XML は前使ってみたとき煩雑だったしもう少し簡単な形式はないものかとネットを見ていたら、どうも Qt5.0 以降から JSON をサポートしているらしい。
- QtCore 5.0: JSON Support in Qt
ということでこれを使うのが良いだろうということで使ってみた。
#include <QJsonObject>
#include <QJsonValue>
class Phoneme
{
public:
QString filename;
double msOffset;
double msPreutterance;
QJsonValue toJson() const
{
QJsonObject object;
object["filename"] = filename;
object["ms_offset"] = msOffset;
object["ms_preutterance"] = msPreutterance;
return QJsonValue(object);
}
};
これは便利すぎる。でもこれだと JSON の形式を Phoneme オブジェクトが知らねばならないし、
そもそも Phoneme がこの形式の JSON にのみ対応するとは限らないので以下の様なクラスを用意する。
class JsonSerializer
{
public:
template<class T> static QJsonValue toJson(const T &t)
{
QJsonValue value;
value << t;
return value;
}
};
あとは << 演算子をグローバルでオーバーロードしさえすればよいので、クラス内で toJson を用意する必要はない。
QJonValue oprator <<(QJsonValue &left, const Phoneme &right)
{
QJsonObject object;
object["filename"] = right.filename;
object["ms_offset"] = right.msOffset;
object["ms_preutterance"] = right.msPreutterance;
return (left = QJsonValue(object));
}
int main()
{
QJsonValue json(JsonSerializer::toJson(phoneme));
return 0;
}
これで良い。あとは QJsonDocument を使って Qt の JSON 系クラスと文字列を行ったり来たりできそう。