/// <summary>Converts the JSONObject into a property file object.</summary>
		/// <param name="jo">JSONObject</param>
		/// <returns>java.util.Properties</returns>
		/// <exception cref="JSONException"/>
		/// <exception cref="org.json.JSONException"/>
		public static java.util.Properties ToProperties(org.json.JSONObject jo)
		{
			java.util.Properties properties = new java.util.Properties();
			if (jo != null)
			{
				System.Collections.Generic.IEnumerator<string> keys = jo.Keys();
				while (keys.HasNext())
				{
					string name = keys.Next();
					properties[name] = jo.GetString(name);
				}
			}
			return properties;
		}
		/// <summary>Reverse the JSONML transformation, making an XML text from a JSONArray.</summary>
		/// <param name="ja">A JSONArray.</param>
		/// <returns>An XML string.</returns>
		/// <exception cref="JSONException"/>
		/// <exception cref="org.json.JSONException"/>
		public static string ToString(org.json.JSONArray ja)
		{
			int i;
			org.json.JSONObject jo;
			string key;
			System.Collections.Generic.IEnumerator<string> keys;
			int length;
			object @object;
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			string tagName;
			string value;
			// Emit <tagName
			tagName = ja.GetString(0);
			org.json.XML.NoSpace(tagName);
			tagName = org.json.XML.Escape(tagName);
			sb.Append('<');
			sb.Append(tagName);
			@object = ja.Opt(1);
			if (@object is org.json.JSONObject)
			{
				i = 2;
				jo = (org.json.JSONObject)@object;
				// Emit the attributes
				keys = jo.Keys();
				while (keys.HasNext())
				{
					key = keys.Next();
					org.json.XML.NoSpace(key);
					value = jo.OptString(key);
					if (value != null)
					{
						sb.Append(' ');
						sb.Append(org.json.XML.Escape(key));
						sb.Append('=');
						sb.Append('"');
						sb.Append(org.json.XML.Escape(value));
						sb.Append('"');
					}
				}
			}
			else
			{
				i = 1;
			}
			// Emit content in body
			length = ja.Length();
			if (i >= length)
			{
				sb.Append('/');
				sb.Append('>');
			}
			else
			{
				sb.Append('>');
				do
				{
					@object = ja.Get(i);
					i += 1;
					if (@object != null)
					{
						if (@object is string)
						{
							sb.Append(org.json.XML.Escape(@object.ToString()));
						}
						else
						{
							if (@object is org.json.JSONObject)
							{
								sb.Append(ToString((org.json.JSONObject)@object));
							}
							else
							{
								if (@object is org.json.JSONArray)
								{
									sb.Append(ToString((org.json.JSONArray)@object));
								}
								else
								{
									sb.Append(@object.ToString());
								}
							}
						}
					}
				}
				while (i < length);
				sb.Append('<');
				sb.Append('/');
				sb.Append(tagName);
				sb.Append('>');
			}
			return sb.ToString();
		}
		/// <summary>Convert a JSONObject into an HTTP header.</summary>
		/// <remarks>
		/// Convert a JSONObject into an HTTP header. A request header must contain
		/// <pre>{
		/// Method: "POST" (for example),
		/// "Request-URI": "/" (for example),
		/// "HTTP-Version": "HTTP/1.1" (for example)
		/// }</pre>
		/// A response header must contain
		/// <pre>{
		/// "HTTP-Version": "HTTP/1.1" (for example),
		/// "Status-Code": "200" (for example),
		/// "Reason-Phrase": "OK" (for example)
		/// }</pre>
		/// Any other members of the JSONObject will be output as HTTP fields.
		/// The result will end with two CRLF pairs.
		/// </remarks>
		/// <param name="jo">A JSONObject</param>
		/// <returns>An HTTP header string.</returns>
		/// <exception cref="JSONException">
		/// if the object does not contain enough
		/// information.
		/// </exception>
		/// <exception cref="org.json.JSONException"/>
		public static string ToString(org.json.JSONObject jo)
		{
			System.Collections.Generic.IEnumerator<string> keys = jo.Keys();
			string @string;
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			if (jo.Has("Status-Code") && jo.Has("Reason-Phrase"))
			{
				sb.Append(jo.GetString("HTTP-Version"));
				sb.Append(' ');
				sb.Append(jo.GetString("Status-Code"));
				sb.Append(' ');
				sb.Append(jo.GetString("Reason-Phrase"));
			}
			else
			{
				if (jo.Has("Method") && jo.Has("Request-URI"))
				{
					sb.Append(jo.GetString("Method"));
					sb.Append(' ');
					sb.Append('"');
					sb.Append(jo.GetString("Request-URI"));
					sb.Append('"');
					sb.Append(' ');
					sb.Append(jo.GetString("HTTP-Version"));
				}
				else
				{
					throw new org.json.JSONException("Not enough material for an HTTP header.");
				}
			}
			sb.Append(CRLF);
			while (keys.HasNext())
			{
				@string = keys.Next();
				if (!"HTTP-Version".Equals(@string) && !"Status-Code".Equals(@string) && !"Reason-Phrase".Equals(@string) && !"Method".Equals(@string) && !"Request-URI".Equals(@string) && !jo.IsNull(@string))
				{
					sb.Append(@string);
					sb.Append(": ");
					sb.Append(jo.GetString(@string));
					sb.Append(CRLF);
				}
			}
			sb.Append(CRLF);
			return sb.ToString();
		}
		/// <summary>
		/// Produce a JSONArray containing the values of the members of this
		/// JSONObject.
		/// </summary>
		/// <param name="names">
		/// A JSONArray containing a list of key strings. This determines
		/// the sequence of the values in the result.
		/// </param>
		/// <returns>A JSONArray of values.</returns>
		/// <exception cref="JSONException">If any of the values are non-finite numbers.</exception>
		/// <exception cref="org.json.JSONException"/>
		public virtual org.json.JSONArray ToJSONArray(org.json.JSONArray names)
		{
			if (names == null || names.Length() == 0)
			{
				return null;
			}
			org.json.JSONArray ja = new org.json.JSONArray();
			for (int i = 0; i < names.Length(); i += 1)
			{
				ja.Put(this.Opt(names.GetString(i)));
			}
			return ja;
		}
		/// <summary>Convert a JSONObject into a cookie specification string.</summary>
		/// <remarks>
		/// Convert a JSONObject into a cookie specification string. The JSONObject
		/// must contain "name" and "value" members.
		/// If the JSONObject contains "expires", "domain", "path", or "secure"
		/// members, they will be appended to the cookie specification string.
		/// All other members are ignored.
		/// </remarks>
		/// <param name="jo">A JSONObject</param>
		/// <returns>A cookie specification string</returns>
		/// <exception cref="JSONException"/>
		/// <exception cref="org.json.JSONException"/>
		public static string ToString(org.json.JSONObject jo)
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			sb.Append(Escape(jo.GetString("name")));
			sb.Append("=");
			sb.Append(Escape(jo.GetString("value")));
			if (jo.Has("expires"))
			{
				sb.Append(";expires=");
				sb.Append(jo.GetString("expires"));
			}
			if (jo.Has("domain"))
			{
				sb.Append(";domain=");
				sb.Append(Escape(jo.GetString("domain")));
			}
			if (jo.Has("path"))
			{
				sb.Append(";path=");
				sb.Append(Escape(jo.GetString("path")));
			}
			if (jo.OptBoolean("secure"))
			{
				sb.Append(";secure");
			}
			return sb.ToString();
		}
		/// <summary>Convert a JSONObject into a cookie list.</summary>
		/// <remarks>
		/// Convert a JSONObject into a cookie list. A cookie list is a sequence
		/// of name/value pairs. The names are separated from the values by '='.
		/// The pairs are separated by ';'. The characters '%', '+', '=', and ';'
		/// in the names and values are replaced by "%hh".
		/// </remarks>
		/// <param name="jo">A JSONObject</param>
		/// <returns>A cookie list string</returns>
		/// <exception cref="JSONException"/>
		/// <exception cref="org.json.JSONException"/>
		public static string ToString(org.json.JSONObject jo)
		{
			bool b = false;
			System.Collections.Generic.IEnumerator<string> keys = jo.Keys();
			string @string;
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			while (keys.HasNext())
			{
				@string = keys.Next();
				if (!jo.IsNull(@string))
				{
					if (b)
					{
						sb.Append(';');
					}
					sb.Append(org.json.Cookie.Escape(@string));
					sb.Append("=");
					sb.Append(org.json.Cookie.Escape(jo.GetString(@string)));
					b = true;
				}
			}
			return sb.ToString();
		}