/*
 * $Id: JSONObject.java,v 1.2 2008-08-07 01:18:54 parg Exp $
 * Created on 2006-4-10
 */
package org.json.simple;

import java.util.Iterator;
import java.util.Map;

import org.gudy.azureus2.core3.util.LightHashMap;

/**
 * @author FangYidong<fangyidong@yahoo.com.cn>
 */
public class JSONObject extends LightHashMap<String,Object>{
	
	public JSONObject() {
		super();
	}

	public JSONObject(int initialCapacity, float loadFactor) {
		super(initialCapacity, loadFactor);
	}

	public JSONObject(int initialCapacity) {
		super(initialCapacity);
	}

	public JSONObject(Map<String,Object> arg0) {
		super(arg0);
	}

	public String toString(){
		ItemList list=new ItemList();
		Iterator<Map.Entry<String, Object>> iter=entrySet().iterator();
		
		while(iter.hasNext()){
			Map.Entry<String, Object> entry=iter.next();
			list.add(toString(entry.getKey().toString(),entry.getValue()));
		}
		return "{"+list.toString()+"}";
	}
	
	public void toString( StringBuilder sb ){
		
		sb.append( "{" );

		Iterator iter=entrySet().iterator();
		
		boolean first = true;
		
		while(iter.hasNext()){
			if ( first ){
				first = false;
			}else{
				sb.append( "," );
			}
			Map.Entry entry=(Map.Entry)iter.next();
			toString(sb, entry.getKey().toString(),entry.getValue());
		}
		
		sb.append( "}" );
	}
	
	public static String toString(String key,Object value){
		StringBuffer sb=new StringBuffer();
		
		sb.append("\"");
		sb.append(escape(key));
		sb.append("\":");
		if(value==null){
			sb.append("null");
			return sb.toString();
		}
		
		if(value instanceof String){
			sb.append("\"");
			sb.append(escape((String)value));
			sb.append("\"");
		}
		else
			sb.append(value);
		return sb.toString();
	}
	
	public static void toString(StringBuilder sb, String key,Object value){
		sb.append("\"");
		escape(sb,key);
		sb.append("\":");
		if(value==null){
			sb.append("null");
			return;
		}
		
		if(value instanceof String){
			sb.append("\"");
			escape(sb,(String)value);
			sb.append("\"");
		}else if ( value instanceof JSONObject ){
			((JSONObject)value).toString( sb );
		}else if ( value instanceof JSONArray ){
			((JSONArray)value).toString( sb );
		}else{
			sb.append(String.valueOf( value ));
		}
	}
	
	/**
	 * " => \" , \ => \\
	 * @param s
	 * @return
	 */
	public static String escape(String s){
		if(s==null)
			return null;
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<s.length();i++){
			char ch=s.charAt(i);
			switch(ch){
			case '"':
				sb.append("\\\"");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\t':
				sb.append("\\t");
				break;
			case '/':
				sb.append("\\/");
				break;
			default:
				if(ch>='\u0000' && ch<='\u001F'){
					String ss=Integer.toHexString(ch);
					sb.append("\\u");
					for(int k=0;k<4-ss.length();k++){
						sb.append('0');
					}
					sb.append(ss.toUpperCase());
				}
				else{
					sb.append(ch);
				}
			}
		}//for
		return sb.toString();
	}
	
	public static void escape(StringBuilder sb, String s){
		if(s==null){
			sb.append((String)null);
		}else{
			for(int i=0;i<s.length();i++){
				char ch=s.charAt(i);
				switch(ch){
				case '"':
					sb.append("\\\"");
					break;
				case '\\':
					sb.append("\\\\");
					break;
				case '\b':
					sb.append("\\b");
					break;
				case '\f':
					sb.append("\\f");
					break;
				case '\n':
					sb.append("\\n");
					break;
				case '\r':
					sb.append("\\r");
					break;
				case '\t':
					sb.append("\\t");
					break;
				case '/':
					sb.append("\\/");
					break;
				default:
					if(ch>='\u0000' && ch<='\u001F'){
						String ss=Integer.toHexString(ch);
						sb.append("\\u");
						for(int k=0;k<4-ss.length();k++){
							sb.append('0');
						}
						sb.append(ss.toUpperCase());
					}
					else{
						sb.append(ch);
					}
				}
			}//for
		}
	}
}
