2012-12-29 23:47:12 +00:00
|
|
|
#include "JsonSerializer.h"
|
|
|
|
|
|
|
|
JsonSerializer::JsonSerializer(QObject *parent) : QObject(parent) {
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
QString JsonSerializer::serialize(const QVariant &object) {
|
2012-12-29 23:47:12 +00:00
|
|
|
addVariant(object);
|
|
|
|
return m_buffer;
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
void JsonSerializer::addVariant(const QVariant &object) {
|
2012-12-29 23:47:12 +00:00
|
|
|
if (object.isValid()) {
|
|
|
|
switch(object.type()) {
|
|
|
|
case QMetaType::QString:
|
|
|
|
{
|
|
|
|
QString string = object.toString();
|
|
|
|
addString(string);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case QMetaType::QVariantList:
|
|
|
|
{
|
|
|
|
QVariantList list = object.toList();
|
|
|
|
addArray(list);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case QMetaType::Double:
|
|
|
|
m_buffer.append(object.toString());
|
|
|
|
break;
|
|
|
|
case QMetaType::QVariantMap:
|
|
|
|
{
|
|
|
|
QVariantMap map = object.toMap();
|
|
|
|
addMap(map);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case QMetaType::Bool:
|
|
|
|
{
|
|
|
|
m_buffer.append(object.toString());
|
|
|
|
break;
|
|
|
|
}
|
2012-12-30 01:48:15 +00:00
|
|
|
case QMetaType::Int:
|
|
|
|
{
|
|
|
|
m_buffer.append(object.toString());
|
|
|
|
break;
|
|
|
|
}
|
2012-12-29 23:47:12 +00:00
|
|
|
default:
|
|
|
|
m_buffer.append("null");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
m_buffer.append("null");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
void JsonSerializer::addString(const QString &string) {
|
2012-12-29 23:47:12 +00:00
|
|
|
m_buffer.append("\"");
|
2012-12-30 01:48:15 +00:00
|
|
|
m_buffer.append(sanitizeString(string));
|
2012-12-29 23:47:12 +00:00
|
|
|
m_buffer.append("\"");
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
void JsonSerializer::addArray(const QVariantList &list) {
|
2012-12-29 23:47:12 +00:00
|
|
|
m_buffer.append("[");
|
|
|
|
for (int i = 0; i < list.length(); i++) {
|
|
|
|
if (i > 0)
|
|
|
|
m_buffer.append(",");
|
|
|
|
addVariant(list[i]);
|
|
|
|
}
|
|
|
|
m_buffer.append("]");
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
void JsonSerializer::addMap(const QVariantMap &map) {
|
2012-12-29 23:47:12 +00:00
|
|
|
m_buffer.append("{");
|
|
|
|
QMapIterator<QString, QVariant> iterator(map);
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
iterator.next();
|
|
|
|
QString key = iterator.key();
|
|
|
|
QVariant value = iterator.value();
|
|
|
|
addString(key);
|
|
|
|
m_buffer.append(":");
|
|
|
|
addVariant(value);
|
|
|
|
if (iterator.hasNext())
|
|
|
|
m_buffer.append(",");
|
|
|
|
}
|
|
|
|
m_buffer.append("}");
|
|
|
|
}
|
|
|
|
|
2012-12-30 01:48:15 +00:00
|
|
|
QString JsonSerializer::sanitizeString(QString str) {
|
|
|
|
str.replace("\\", "\\\\");
|
2012-12-30 18:45:23 +00:00
|
|
|
str.replace("\"", "\\\"");
|
|
|
|
str.replace("\b", "\\b");
|
|
|
|
str.replace("\f", "\\f");
|
|
|
|
str.replace("\n", "\\n");
|
|
|
|
str.replace("\r", "\\r");
|
|
|
|
str.replace("\t", "\\t");
|
2012-12-30 01:48:15 +00:00
|
|
|
|
|
|
|
QString result;
|
|
|
|
const ushort* unicode = str.utf16();
|
|
|
|
unsigned int i = 0;
|
|
|
|
|
|
|
|
while (unicode[i]) {
|
2012-12-30 18:45:23 +00:00
|
|
|
if (unicode[i] > 31 && unicode[i] < 128) {
|
2012-12-30 01:48:15 +00:00
|
|
|
result.append(unicode[i]);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
QString hexCode = QString::number(unicode[i], 16).rightJustified(4, '0');
|
|
|
|
|
|
|
|
result.append("\\u").append(hexCode);
|
|
|
|
}
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
|
2012-12-30 18:45:23 +00:00
|
|
|
return result;
|
2012-12-30 01:48:15 +00:00
|
|
|
}
|
|
|
|
|