Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version
Go to top

fastJSON

, 14 Sep 2014
Smallest, fastest polymorphic JSON serializer (with Silverlight4 and MonoDroid support)
consoletest-noexe.zip
consoletest.zip
fastjson-noexe.zip
fastJSON.snk
fastjson.zip
fastJSON.snk
fastJSON_2.0.28.1.zip
Consoletest
fastJSON
fastJSON.snk
Properties
README.md
UnitTests
UnitTests.nunit
Properties
fastjson_v1.1-noexe.zip
fastJSON_v1.1.zip
Properties
fastjson_v1.2-noexe.zip
fastJSON_v1.2.zip
fastjson_v1.3-noexe.zip
fastJSON_v1.3.zip
fastjson_v1.4-noexe.zip
fastJSON_v1.4.zip
fastjson_v1.5-noexe.zip
fastJSON_v1.5.zip
fastjson_v1.6-noexe.zip
fastJSON_v1.6.zip
fastjson_v1.7-noexe.zip
fastjson_v1.7.5-noexe.zip
fastJSON_v1.7.5.zip
fastjson_v1.7.6-noexe.zip
fastJSON_v1.7.6.zip
fastjson_v1.7.7-noexe.zip
fastjson_v1.7.7-silverlight4-noexe.zip
fastJSON_v1.7.7-SilverLight4.zip
fastJSON_v1.7.7.zip
fastJSON_v1.7.zip
fastjson_v1.8-noexe.zip
fastJSON_v1.8.zip
fastjson_v1.9-noexe.zip
fastjson_v1.9.1-noexe.zip
fastJSON_v1.9.1.zip
fastjson_v1.9.2-noexe.zip
fastjson_v1.9.2.zip
fastjson_v1.9.3-noexe.zip
fastJSON_v1.9.3.zip
fastjson_v1.9.4-noexe.zip
fastJSON_v1.9.4.zip
fastjson_v1.9.6-noexe.zip
fastJSON_v1.9.6.zip
fastjson_v1.9.7-noexe.zip
fastJSON_v1.9.7.zip
fastjson_v1.9.8-noexe.zip
fastJSON_v1.9.8.zip
fastjson_v1.9.9-noexe.zip
fastJSON_v1.9.9.zip
fastJSON_v1.9.zip
fastjson_v2.0.0-noexe.zip
UnitTests.nunit
fastJSON_v2.0.0.zip
UnitTests.nunit
fastjson_v2.0.1-noexe.zip
UnitTests.nunit
fastJSON_v2.0.1.zip
UnitTests.nunit
fastjson_v2.0.10-noexe.zip
UnitTests.nunit
fastJSON_v2.0.10.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.11-noexe.zip
UnitTests.nunit
fastJSON_v2.0.11.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.12-noexe.zip
UnitTests.nunit
fastJSON_v2.0.12.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.13-noexe.zip
UnitTests.nunit
fastJSON_v2.0.13.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.14-noexe.zip
UnitTests.nunit
fastJSON_v2.0.14.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.15-noexe.zip
UnitTests.nunit
fastJSON_v2.0.15.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.16-noexe.zip
UnitTests.nunit
fastJSON_v2.0.16.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.17-noexe.zip
UnitTests.nunit
fastJSON_v2.0.17.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.18-noexe.zip
UnitTests.nunit
fastJSON_v2.0.18.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.19-noexe.zip
UnitTests.nunit
fastJSON_v2.0.19.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.2-noexe.zip
UnitTests.nunit
fastJSON_v2.0.2.zip
UnitTests.nunit
fastjson_v2.0.20-noexe.zip
UnitTests.nunit
fastJSON_v2.0.20.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.21-noexe.zip
UnitTests.nunit
fastJSON_v2.0.21.zip
UnitTests.nunit
fastJSON-SL.v11.suo
fastJSON.nuspec
fastjson_v2.0.22-noexe.zip
fastJSON.nuspec
README.md
UnitTests.nunit
fastJSON_v2.0.22.zip
fastJSON.nuspec
README.md
UnitTests.nunit
fastJSON.snk
fastjson_v2.0.23-noexe.zip
README.md
UnitTests.nunit
fastJSON_v2.0.23.zip
README.md
UnitTests.nunit
fastJSON.snk
fastjson_v2.0.24-noexe.zip
README.md
UnitTests.nunit
fastJSON_v2.0.24.zip
README.md
UnitTests.nunit
fastJSON.snk
fastjson_v2.0.25-noexe.zip
README.md
UnitTests.nunit
fastJSON_v2.0.25.zip
README.md
UnitTests.nunit
fastJSON.snk
fastjson_v2.0.26-noexe.zip
README.md
UnitTests.nunit
fastJSON_v2.0.26.zip
README.md
UnitTests.nunit
fastJSON.snk
fastjson_v2.0.27-noexe.zip
README.md
UnitTests.nunit
fastJSON_v2.0.27.zip
README.md
UnitTests.nunit
fastJSON.snk
fastJSON_v2.0.28.zip
fastJSON.snk
README.md
UnitTests.nunit
fastjson_v2.0.3-noexe.zip
UnitTests.nunit
fastJSON_v2.0.3.zip
UnitTests.nunit
fastjson_v2.0.4-noexe.zip
UnitTests.nunit
fastjson_v2.0.4.zip
UnitTests.nunit
fastjson_v2.0.5-noexe.zip
UnitTests.nunit
fastJSON_v2.0.5.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.6-noexe.zip
UnitTests.nunit
fastJSON_v2.0.6.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.7-noexe.zip
UnitTests.nunit
fastJSON_v2.0.7.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.8-noexe.zip
UnitTests.nunit
fastJSON_v2.0.8.zip
UnitTests.nunit
fastJSON.nuspec
fastjson_v2.0.9-noexe.zip
UnitTests.nunit
fastJSON_v2.0.9.zip
UnitTests.nunit
fastJSON.nuspec
fastJSON_v2.1.0.zip
fastJSON.snk
README.md
UnitTests.nunit
fastJSON_v2.1.1.zip
fastJSON.snk
README.md
UnitTests.nunit
fastJSON_v2.1.2.zip
fastJSON.snk
README.md
UnitTests.nunit
fastJSON_v2.1.3.zip
fastJSON.snk
README.md
UnitTests.nunit
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;

namespace fastJSON
{
	internal class JSONSerializer
	{
		private readonly StringBuilder _output = new StringBuilder();
		
		public static string ToJSON(object obj)
		{
			return new JSONSerializer().ConvertToJSON(obj);
		}

		internal string ConvertToJSON(object obj)
		{
			WriteValue(obj);

			return _output.ToString();
		}

		private void WriteValue(object obj)
		{
			if (obj == null)
				_output.Append("null");
			
			else if (obj is sbyte ||
			         obj is byte ||
			         obj is short ||
			         obj is ushort ||
			         obj is int ||
			         obj is uint ||
			         obj is long ||
			         obj is ulong ||
			         obj is decimal ||
			         obj is double ||
			         obj is float)
				_output.Append(Convert.ToString(obj,NumberFormatInfo.InvariantInfo));
			
			else if (obj is bool)
				_output.Append(obj.ToString().ToLower()); // conform to standard
			
			else if (obj is char || obj is Enum || obj is Guid || obj is string)
				WriteString(obj.ToString());
			
			else if (obj is DateTime)
			{
				_output.Append("\"");
				_output.Append(((DateTime)obj).ToString("yyyy-MM-dd HH:mm:ss"));// conform to standard
				_output.Append("\"");
			}
			
			else if(obj is DataSet)
				WriteDataset((DataSet)obj);
			
			else if( obj is byte[])
				WriteByteArray((byte[]) obj);
			
			else if (obj is IDictionary)
				WriteDictionary((IDictionary)obj);
			
			else if (obj is Array || obj is IList || obj is ICollection)
				WriteArray((IEnumerable)obj);
			
			else
				WriteObject(obj);
			
		}
		
		private void WriteByteArray(byte[] bytes)
		{
			WriteString(Convert.ToBase64String(bytes));
		}
			
		private void WriteDataset(DataSet ds)
		{
			_output.Append("{");
			WritePair("$schema", ds.GetXmlSchema());
			_output.Append(",");

			foreach (DataTable table in ds.Tables)
			{
				_output.Append("\"");
				_output.Append(table.TableName);
				_output.Append("\":[");

				foreach (DataRow row in table.Rows)
				{
					_output.Append("{");
					foreach (DataColumn column in row.Table.Columns)
					{
						WritePair(column.ColumnName, row[column]);
					}
					_output.Append("}");
				}

				_output.Append("]");
			}
			// end dataset
			_output.Append("}");
		}

		private void WriteObject(object obj)
		{
			_output.Append("{");
			Type  t = obj.GetType();
			WritePair("$type", t.AssemblyQualifiedName);
			_output.Append(",");

			List<Getters> g = JSON.Instance.GetGetters(t);
			foreach (Getters p in g)
			{
				WritePair(p.Name,p.Getter(obj));
			}
			_output.Append("}");
		}
		
		private void WritePair(string name, string value)
		{
			WriteString(name);

			_output.Append(":");
			
			WriteString(value);
		}

		private void WritePair(string name, object value)
		{
			WriteString(name);

			_output.Append(":");

			WriteValue(value);
		}

		private void WriteArray(IEnumerable array)
		{
			_output.Append("[");

			bool pendingSeperator = false;

			foreach (object obj in array)
			{
				if (pendingSeperator)
					_output.Append(',');

				WriteValue(obj);

				pendingSeperator = true;
			}

			_output.Append("]");
		}

		private void WriteDictionary(IDictionary dic)
		{
			_output.Append("[");

			bool pendingSeparator = false;

			foreach (DictionaryEntry entry in dic)
			{
				if (pendingSeparator)
					_output.Append(",");

				_output.Append("{");
				WritePair("k",entry.Key);
				_output.Append(",");
				WritePair("v",entry.Value);
				_output.Append("}");


				pendingSeparator = true;
			}

			_output.Append("]");
		}
		
		private void WriteString(string s)
		{
			_output.Append('\"');

			foreach (char c in s)
			{
				switch (c)
				{
						case '\t': _output.Append("\\t"); break;
						case '\r': _output.Append("\\r"); break;
						case '\n': _output.Append("\\n"); break;
					case '"' :
						case '\\': _output.Append("\\");  _output.Append(c); break;
					default:
						{
							if (c >= ' ' && c < 128)
								_output.Append(c);
							else
							{
								_output.Append("\\u");
								_output.Append(((int)c).ToString("X4"));
							}
						}
						break;
				}
			}

			_output.Append('\"');
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with an