35 #ifdef QM_DBUS_ENABLED 43 QMap<QString, FromComplexJsonFunc> QMJsonValue::mFromFuncs;
59 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
67 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
75 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
80 if(value.isNull() ==
true)
83 mValue = QMPointer<QMJsonTypeBase>();
88 mValue = value->mValue;
96 if(value.isNull() ==
true)
98 auto array = QMPointer<QMJsonArray>(
new QMJsonArray());
100 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
105 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
113 if(value.isNull() ==
true)
115 auto object = QMPointer<QMJsonObject>(
new QMJsonObject());
117 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
122 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
131 mValue = QMPointer<QMJsonTypeBase>();
135 mType = value->mType;
136 mValue = value->mValue;
146 auto array = QMPointer<QMJsonArray>(
new QMJsonArray());
148 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
152 auto array = QMPointer<QMJsonArray>(
value);
154 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
164 auto object = QMPointer<QMJsonObject>(
new QMJsonObject());
166 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
170 auto object = QMPointer<QMJsonObject>(
value);
172 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
181 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
189 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
197 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
205 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
213 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
221 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
229 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
237 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
245 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
253 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
261 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
264 #if UINTPTR_MAX == 0xffffffff 271 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
279 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
282 #elif UINTPTR_MAX == 0xffffffffffffffff 289 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
297 mValue = qSharedPointerDynamicCast<QMJsonTypeBase>(
type);
344 return this->
toBool(
false);
353 if(this->
toString(
"").toLower() ==
"true")
375 if(this->
toBool(
false) ==
true)
384 return this->
toString(
"").toDouble();
403 if(this->
toBool(
false) ==
true)
409 return QString::number(this->
toDouble(0));
425 static auto defaultValue = QMPointer<QMJsonArray>(
new QMJsonArray);
426 auto type = qSharedPointerDynamicCast<QMJsonType<QMPointer<QMJsonArray> > >(mValue);
436 static auto defaultValue = QMPointer<QMJsonObject>(
new QMJsonObject);
437 auto type = qSharedPointerDynamicCast<QMJsonType<QMPointer<QMJsonObject> > >(mValue);
447 auto type = qSharedPointerDynamicCast<QMJsonType<bool> >(mValue);
457 auto type = qSharedPointerDynamicCast<QMJsonType<double> >(mValue);
467 auto type = qSharedPointerDynamicCast<QMJsonType<QString> >(mValue);
477 auto type = qSharedPointerDynamicCast<QMJsonType<QMPointer<QMJsonArray> > >(mValue);
487 auto type = qSharedPointerDynamicCast<QMJsonType<QMPointer<QMJsonObject> > >(mValue);
503 return this->set<bool>(
value);
507 return this->set<double>(1);
509 return this->set<double>(0);
513 return this->set<QString>(
"true");
515 return this->set<QString>(
"false");
535 return this->set<bool>(
false);
537 return this->set<bool>(
true);
540 return this->set<double>(
value);
543 return this->set<QString>(QString::number(value));
563 return this->set<bool>(
true);
565 return this->set<bool>(
false);
570 auto result = value.toDouble(&ok);
575 return this->set<double>(result);
579 return this->set<QString>(
value);
601 if(value.isNull() ==
true)
602 return this->
set<QMPointer<QMJsonArray> >(QMPointer<QMJsonArray>(
new QMJsonArray));
604 return this->set<QMPointer<QMJsonArray> >(
value);
626 if(value.isNull() ==
true)
627 return this->
set<QMPointer<QMJsonObject> >(QMPointer<QMJsonObject>(
new QMJsonObject));
629 return this->set<QMPointer<QMJsonObject> >(
value);
640 if(value.isNull() ==
true)
649 return value->isNull();
652 return this->
fromBool(value->toBool());
661 return this->
fromArray(value->toArray());
675 return this->
toArray()->value(index);
680 return this->
toObject()->value(key);
691 return QVariant(this->
toBool());
701 auto list = QVariantList();
704 list.append(
value->toVariant());
706 return QVariant::fromValue(list);
711 auto hash = QVariantHash();
712 const auto &
object = this->
toObject();
714 for(
const auto &key : object->keys())
715 hash[key] = object->value(key)->toVariant();
717 return QVariant::fromValue(hash);
731 case QMetaType::QVariantMap:
732 case QMetaType::QVariantHash:
734 auto object = QMPointer<QMJsonObject>(
new QMJsonObject);
735 auto iterable = value.value<QAssociativeIterable>();
736 auto it = iterable.begin();
737 const auto end = iterable.end();
739 for(; it != end; ++it)
742 return QMPointer<QMJsonValue>(
new QMJsonValue(
object));
745 case QMetaType::QVariantList:
747 auto array = QMPointer<QMJsonArray>(
new QMJsonArray);
749 for(
const auto &variant : value.value<QSequentialIterable>())
752 return QMPointer<QMJsonValue>(
new QMJsonValue(array));
758 case QMetaType::Bool:
759 return QMPointer<QMJsonValue>(
new QMJsonValue(value.value<
bool>()));
762 case QMetaType::UInt:
764 case QMetaType::Double:
766 case QMetaType::LongLong:
768 case QMetaType::ULongLong:
774 return QMPointer<QMJsonValue>(
new QMJsonValue(value.value<
double>()));
776 case QMetaType::QChar:
777 case QMetaType::QString:
778 case QMetaType::QByteArray:
779 return QMPointer<QMJsonValue>(
new QMJsonValue(value.value<QString>()));
781 case QMetaType::User:
784 #ifdef QM_DBUS_ENABLED 786 if(value.canConvert<QDBusArgument>() ==
true)
788 const auto &arg = value.value<QDBusArgument>();
790 switch(arg.currentType())
792 case QDBusArgument::BasicType:
793 case QDBusArgument::VariantType:
794 case QDBusArgument::StructureType:
797 case QDBusArgument::ArrayType:
799 auto array = QMPointer<QMJsonArray>(
new QMJsonArray);
806 return QMPointer<QMJsonValue>(
new QMJsonValue(array));
814 if(value.canConvert<QDBusObjectPath>() ==
true)
815 return QMPointer<QMJsonValue>(
new QMJsonValue(value.value<QDBusObjectPath>().path()));
817 if(value.canConvert<QDBusVariant>() ==
true)
838 auto index = (int32_t)mType;
839 static auto strings = QList<QString>()
840 <<
"QMJsonValueType_Null" 841 <<
"QMJsonValueType_Bool" 842 <<
"QMJsonValueType_Double" 843 <<
"QMJsonValueType_String" 844 <<
"QMJsonValueType_Array" 845 <<
"QMJsonValueType_Object" 846 <<
"QMJsonValueType_Custom" 847 <<
"QMJsonValueType_Unknown";
849 if(index < 0) index = strings.count() - 1;
850 if(index >= strings.count()) index = strings.count() - 1;
852 return strings.at(index);
857 if(mValue.isNull() ==
true)
864 if(mValue->isBaseType() ==
true)
866 return mValue->toJson(format, sort);
881 mValue->toComplexJson(obj);
886 if(obj->contains(
"qmjsontype") ==
false)
892 return value->toJson(format, sort);
898 QSaveFile file(filename);
899 QTextStream stream(&file);
901 if(file.open(QIODevice::WriteOnly | QIODevice::Text) ==
false)
904 stream << this->
toJson(format, sort) <<
"\r\n";
906 return file.commit();
913 auto value = QMPointer<QMJsonValue>();
917 QMJsonValue::skipSpaces(json, index);
919 if(index >= json.length())
924 if(
value.isNull() ==
false)
928 catch(
const QString &str)
930 qDebug() <<
"QMJsonValue::fromJson Failed -" + str;
936 QMPointer<QMJsonValue> QMJsonValue::fromComplexJson(
const QMPointer<QMJsonValue> &value)
938 if(value.isNull() ==
true)
941 if(value->isObject() ==
true)
943 auto obj = value->toObject();
945 if(obj->contains(
"qmjsontype") ==
true)
947 auto func = mFromFuncs[obj->value(
"qmjsontype")->toString()];
952 auto result = func(obj);
954 if(result.isNull() ==
true)
966 if(qmjsontype.isEmpty() ==
true)
972 mFromFuncs[qmjsontype] = func;
975 void QMJsonValue::skipSpaces(
const QString &json, int32_t &index)
977 while(index < json.length() && json.at(index).isSpace() ==
true)
981 void QMJsonValue::verifyIndex(
const QString &json, int32_t &index)
983 if(index >= json.length())
984 QMJsonValue::throwError(json, index,
"Incomplete JSON");
989 auto value = QMPointer<QMJsonValue>();
991 QMJsonValue::skipSpaces(json, index);
992 QMJsonValue::verifyIndex(json, index);
1033 switch(json.at(index).toLatin1())
1039 return QMJsonValue::fromComplexJson(
QMJsonType<QMPointer<QMJsonObject> >::
fromJson(json, index));
1057 QMJsonValue::verifyIndex(json, index); valid &= json.at(index).toLower() ==
'u'; index++;
1058 QMJsonValue::verifyIndex(json, index); valid &= json.at(index).toLower() ==
'l'; index++;
1059 QMJsonValue::verifyIndex(json, index); valid &= json.at(index).toLower() ==
'l'; index++;
1062 QMJsonValue::throwError(json, index,
"Unexpected token. Expected \"NULL\" while parsing JSON.");
1069 QMJsonValue::throwError(json, index,
"Unexpected closing bracket. Are there too many commas?");
1080 QFile file(filename);
1082 if(file.exists() ==
false)
1083 return QMPointer<QMJsonValue>();
1085 if(file.open(QIODevice::ReadOnly | QIODevice::Text) ==
false)
1086 return QMPointer<QMJsonValue>();
1091 void QMJsonValue::throwError(
const QString &json, int32_t index, QString error)
1093 throw(error +
" - Line Number: " + QString::number(json.left(index).count(
"\n")));
1098 QDebugStateSaver saver(dbg);
1099 dbg.nospace() <<
"QMJsonValue(";
1101 if(value.mValue != NULL)
1103 value.mValue->print(dbg);
1108 dbg <<
"NULL" <<
")";
1114 QDebug operator<<(QDebug dbg, const QMPointer<QMJsonValue> &value)
1116 if(value.isNull() ==
true)
1118 QDebugStateSaver saver(dbg);
1120 dbg.nospace() <<
"QMPointer<";
1121 dbg <<
"QMJsonValue" <<
">: NULL";
1127 return dbg << *value;
virtual bool isDouble(void) const
virtual bool fromBool(bool value)
static QMPointer< QMJsonValue > fromJson(const QString &json)
virtual bool toJsonFile(const QString &filename, QMJsonFormat format=QMJsonFormat_Pretty, QMJsonSort sort=QMJsonSort_None) const
virtual bool isNull(void) const
virtual bool toBool(void) const
virtual const QString & typeString(void) const
virtual void set(const T &value)
virtual bool isBool(void) const
static QMPointer< QMJsonValue > fromJson(const QString &json, int32_t &index)
virtual QString toString(void) const
virtual bool isObject(void) const
virtual QVariant toVariant(void)
virtual const QMPointer< QMJsonValue > & value(int32_t index) const
virtual bool isArray(void) const
virtual bool isString(void) const
virtual bool fromObject(const QMPointer< QMJsonObject > &value)
virtual const QMPointer< QMJsonObject > & toObject(void) const
virtual bool fromArray(const QMPointer< QMJsonArray > &value)
virtual QMJsonValueType type(void) const
virtual QString toJson(QMJsonFormat format=QMJsonFormat_Pretty, QMJsonSort sort=QMJsonSort_None) const
virtual const QMPointer< QMJsonArray > & toArray(void) const
static QMPointer< QMJsonValue > fromVariant(const QVariant &value)
virtual bool fromDouble(double value)
virtual double toDouble(void) const
virtual bool from(const QMPointer< QMJsonValue > &value)
QDebug operator<<(QDebug dbg, const QMJsonValue &value)
static QMPointer< QMJsonValue > fromJsonFile(const QString &filename)
virtual bool fromString(const QString &value)
QMPointer< QMJsonValue >(* FromComplexJsonFunc)(const QMPointer< QMJsonObject > &obj)
static void registerFromComplexJson(const QString &qmjsontype, FromComplexJsonFunc func)