00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #include "jsonSerializer.h"
00014
00015 #include <QTextCodec>
00016 #include <QVariant>
00017 #include <QDateTime>
00018
00020
00022
00023 JSONSerializer::JSONSerializer( QIODevice *pDevice, const QString &sRequestName )
00024 : m_Stream( pDevice ), m_bCommaNeeded( false )
00025 {
00026 }
00027
00029
00031
00032 JSONSerializer::~JSONSerializer()
00033 {
00034 }
00035
00037
00039
00040 QString JSONSerializer::GetContentType()
00041 {
00042 return "application/json";
00043 }
00044
00045
00047
00049
00050 void JSONSerializer::BeginSerialize( QString &sName )
00051 {
00052 m_bCommaNeeded = false;
00053
00054 m_Stream << "{";
00055 }
00056
00058
00060
00061 void JSONSerializer::EndSerialize()
00062 {
00063 m_bCommaNeeded = false;
00064
00065 m_Stream << "}";
00066
00067 m_Stream.flush();
00068 }
00069
00070
00072
00074
00075 void JSONSerializer::BeginObject( const QString &sName, const QObject *pObject )
00076 {
00077 m_bCommaNeeded = false;
00078
00079 m_Stream << "\"" << sName << "\": {";
00080 }
00081
00083
00085
00086 void JSONSerializer::EndObject ( const QString &sName, const QObject *pObject )
00087 {
00088 m_bCommaNeeded = false;
00089
00090 m_Stream << "}";
00091 }
00092
00094
00096
00097 void JSONSerializer::AddProperty( const QString &sName,
00098 const QVariant &vValue,
00099 const QMetaObject *pMetaParent,
00100 const QMetaProperty *pMetaProp )
00101 {
00102 if (m_bCommaNeeded)
00103 m_Stream << ", ";
00104
00105 m_Stream << "\"" << sName << "\": ";
00106
00107 RenderValue( vValue );
00108
00109 m_bCommaNeeded = true;
00110 }
00111
00113
00115
00116 void JSONSerializer::RenderValue( const QVariant &vValue )
00117 {
00118
00119
00120
00121
00122
00123 if ( vValue.canConvert< QObject* >())
00124 {
00125 const QObject *pObject = vValue.value< QObject* >();
00126
00127 bool bSavedCommaNeeded = m_bCommaNeeded;
00128 m_bCommaNeeded = false;
00129
00130 m_Stream << "{";
00131 SerializeObjectProperties( pObject );
00132 m_Stream << "}";
00133
00134 m_bCommaNeeded = bSavedCommaNeeded;
00135
00136 return;
00137 }
00138
00139
00140
00141
00142
00143 switch( vValue.type() )
00144 {
00145 case QVariant::List: RenderList ( vValue.toList() ); break;
00146 case QVariant::StringList: RenderStringList( vValue.toStringList() ); break;
00147 case QVariant::Map: RenderMap ( vValue.toMap() ); break;
00148 case QVariant::DateTime:
00149 {
00150 m_Stream << "\"" << Encode( vValue.toDateTime().toUTC()
00151 .toString(Qt::ISODate) ) << "\"";
00152 break;
00153 }
00154 default:
00155 {
00156 m_Stream << "\"" << Encode( vValue.toString() ) << "\"";
00157 break;
00158 }
00159 }
00160 }
00161
00163
00165
00166 void JSONSerializer::RenderList( const QVariantList &list )
00167 {
00168 bool bFirst = true;
00169
00170 m_Stream << "[";
00171
00172 QListIterator< QVariant > it( list );
00173
00174 while (it.hasNext())
00175 {
00176 if (bFirst)
00177 bFirst = false;
00178 else
00179 m_Stream << ",";
00180
00181 RenderValue( it.next() );
00182 }
00183
00184 m_Stream << "]";
00185 }
00186
00188
00190
00191 void JSONSerializer::RenderStringList( const QStringList &list )
00192 {
00193 bool bFirst = true;
00194
00195 m_Stream << "[";
00196
00197 QListIterator< QString > it( list );
00198
00199 while (it.hasNext())
00200 {
00201 if (bFirst)
00202 bFirst = false;
00203 else
00204 m_Stream << ",";
00205
00206 m_Stream << "\"" << Encode( it.next() ) << "\"";
00207 }
00208
00209 m_Stream << "]";
00210 }
00211
00213
00215
00216 void JSONSerializer::RenderMap( const QVariantMap &map )
00217 {
00218 bool bFirst = true;
00219
00220 m_Stream << "{";
00221
00222 QMapIterator< QString, QVariant > it( map );
00223
00224 while (it.hasNext())
00225 {
00226 it.next();
00227
00228 if (bFirst)
00229 bFirst = false;
00230 else
00231 m_Stream << ",";
00232
00233 m_Stream << "\"" << it.key() << "\":";
00234 m_Stream << "\"" << Encode( it.value().toString() ) << "\"";
00235 }
00236
00237 m_Stream << "}";
00238 }
00239
00241
00243
00244 QString JSONSerializer::Encode(const QString &sIn)
00245 {
00246 if (sIn.isEmpty())
00247 return sIn;
00248
00249 QString sStr = sIn;
00250
00251
00252
00253
00254
00255 sStr.replace( '\\', "\\\\" );
00256 sStr.replace( '"' , "\\\"" );
00257
00258 sStr.replace( '\b', "\\b" );
00259 sStr.replace( '\f', "\\f" );
00260 sStr.replace( '\n', "\\n" );
00261 sStr.replace( "\r", "\\r" );
00262 sStr.replace( "\t", "\\t" );
00263 sStr.replace( "/", "\\/" );
00264
00265
00266
00267
00268
00269
00270 return sStr;
00271 }