Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONArray.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONArray.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONArray.cs	(revision 309)
@@ -23,23 +23,22 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
-			StringBuilder sb = new StringBuilder ("[");
+			stringBuilder.Append ("[");
 			if (prettyPrint)
-				sb.Append ('\n');
+				stringBuilder.Append ('\n');
 			foreach (JSONNode n in nodes) {
 				if (prettyPrint)
-					sb.Append (new String ('\t', currentLevel + 1));
-				sb.Append (n.ToString (prettyPrint, currentLevel + 1));
-				sb.Append (",");
+					stringBuilder.Append (new String ('\t', currentLevel + 1));
+				n.ToString (stringBuilder, prettyPrint, currentLevel + 1);
+				stringBuilder.Append (",");
 				if (prettyPrint)
-					sb.Append ('\n');
+					stringBuilder.Append ('\n');
 			}
-			if (sb.Length > 1)
-				sb.Remove (sb.Length - (prettyPrint ? 2 : 1), 1);
+			if (stringBuilder.Length > 1)
+				stringBuilder.Remove (stringBuilder.Length - (prettyPrint ? 2 : 1), 1);
 			if (prettyPrint)
-				sb.Append (new String ('\t', currentLevel));
-			sb.Append ("]");
-			return sb.ToString ();
+				stringBuilder.Append (new String ('\t', currentLevel));
+			stringBuilder.Append ("]");
 		}
 
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONBoolean.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONBoolean.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONBoolean.cs	(revision 309)
@@ -1,3 +1,4 @@
 using System;
+using System.Text;
 
 namespace AllocsFixes.JSON
@@ -17,7 +18,7 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
-			return value.ToString (System.Globalization.CultureInfo.InvariantCulture).ToLower ();
+			stringBuilder.Append (value ? "true" : "false");
 		}
 
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONNode.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONNode.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONNode.cs	(revision 309)
@@ -1,3 +1,4 @@
 using System;
+using System.Text;
 
 namespace AllocsFixes.JSON
@@ -5,6 +6,11 @@
 	public abstract class JSONNode
 	{
-		public abstract string ToString(bool prettyPrint = false, int currentLevel = 0);
+		public abstract void ToString(StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0);
+
+		public override string ToString () {
+			StringBuilder sb = new StringBuilder ();
+			ToString (sb);
+			return sb.ToString ();
+		}
 	}
 }
-
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONNull.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONNull.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONNull.cs	(revision 309)
@@ -1,3 +1,4 @@
 using System;
+using System.Text;
 
 namespace AllocsFixes.JSON
@@ -9,7 +10,7 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
-			return "null";
+			stringBuilder.Append ("null");
 		}
 
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONNumber.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONNumber.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONNumber.cs	(revision 309)
@@ -23,7 +23,7 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
-			return value.ToString (System.Globalization.CultureInfo.InvariantCulture);
+			stringBuilder.Append (value.ToCultureInvariantString ());
 		}
 
@@ -86,5 +86,5 @@
 				} else {
 					double number;
-					if (!double.TryParse (sbNum.ToString (), out number)) {
+					if (!Utils.TryParseDouble(sbNum.ToString (), out number)) {
 						throw new MalformedJSONException ("Mantissa is not a valid decimal (\"" + sbNum.ToString () + "\")");
 					}
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONObject.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONObject.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONObject.cs	(revision 309)
@@ -32,26 +32,25 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
-			StringBuilder sb = new StringBuilder ("{");
+			stringBuilder.Append ("{");
 			if (prettyPrint)
-				sb.Append ('\n');
+				stringBuilder.Append ('\n');
 			foreach (KeyValuePair<string, JSONNode> kvp in nodes) {
 				if (prettyPrint)
-					sb.Append (new String ('\t', currentLevel + 1));
-				sb.Append (String.Format ("\"{0}\":", kvp.Key));
+					stringBuilder.Append (new String ('\t', currentLevel + 1));
+				stringBuilder.Append (String.Format ("\"{0}\":", kvp.Key));
 				if (prettyPrint)
-					sb.Append (" ");
-				sb.Append (kvp.Value.ToString (prettyPrint, currentLevel + 1));
-				sb.Append (",");
+					stringBuilder.Append (" ");
+				kvp.Value.ToString (stringBuilder, prettyPrint, currentLevel + 1);
+				stringBuilder.Append (",");
 				if (prettyPrint)
-					sb.Append ('\n');
+					stringBuilder.Append ('\n');
 			}
-			if (sb.Length > 1)
-				sb.Remove (sb.Length - (prettyPrint ? 2 : 1), 1);
+			if (stringBuilder.Length > 1)
+				stringBuilder.Remove (stringBuilder.Length - (prettyPrint ? 2 : 1), 1);
 			if (prettyPrint)
-				sb.Append (new String ('\t', currentLevel));
-			sb.Append ("}");
-			return sb.ToString ();
+				stringBuilder.Append (new String ('\t', currentLevel));
+			stringBuilder.Append ("}");
 		}
 
Index: binary-improvements/7dtd-server-fixes/src/JSON/JSONString.cs
===================================================================
--- binary-improvements/7dtd-server-fixes/src/JSON/JSONString.cs	(revision 307)
+++ binary-improvements/7dtd-server-fixes/src/JSON/JSONString.cs	(revision 309)
@@ -18,14 +18,17 @@
 		}
 
-		public override string ToString (bool prettyPrint = false, int currentLevel = 0)
+		public override void ToString (StringBuilder stringBuilder, bool prettyPrint = false, int currentLevel = 0)
 		{
 			if (value == null || value.Length == 0) {
-				return "\"\"";
+				stringBuilder.Append ("\"\"");
+				return;
 			}
 
 			int len = value.Length;
 
-			StringBuilder sb = new StringBuilder (len + 4);
+			stringBuilder.EnsureCapacity (stringBuilder.Length + 2*len);
 			String t;
+
+			stringBuilder.Append ('"');
 
 			foreach (char c in value) {
@@ -34,28 +37,28 @@
 					case '"':
 //					case '/':
-						sb.Append ('\\');
-						sb.Append (c);
+						stringBuilder.Append ('\\');
+						stringBuilder.Append (c);
 						break;
 					case '\b':
-						sb.Append ("\\b");
+						stringBuilder.Append ("\\b");
 						break;
 					case '\t':
-						sb.Append ("\\t");
+						stringBuilder.Append ("\\t");
 						break;
 					case '\n':
-						sb.Append ("\\n");
+						stringBuilder.Append ("\\n");
 						break;
 					case '\f':
-						sb.Append ("\\f");
+						stringBuilder.Append ("\\f");
 						break;
 					case '\r':
-						sb.Append ("\\r");
+						stringBuilder.Append ("\\r");
 						break;
 					default:
 						if (c < ' ') {
-							t = "000" + String.Format ("X", c);
-							sb.Append ("\\u" + t.Substring (t.Length - 4));
+							stringBuilder.Append ("\\u");
+							stringBuilder.Append (((int)c).ToString ("X4"));
 						} else {
-							sb.Append (c);
+							stringBuilder.Append (c);
 						}
 						break;
@@ -63,5 +66,5 @@
 			}
 
-			return string.Format ("\"{0}\"", sb.ToString ());
+			stringBuilder.Append ('"');
 		}
 
