improve toString performance

This commit is contained in:
chris.nokleberg
2009-01-20 06:48:00 +00:00
parent c6b0a68c37
commit af440720f8
3 changed files with 52 additions and 182 deletions

View File

@@ -1,147 +0,0 @@
/*
* $Id: ItemList.java,v 1.1 2006/04/15 14:10:48 platform Exp $
* Created on 2006-3-24
*/
package org.json.simple;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* |a:b:c| => |a|,|b|,|c|
* |:| => ||,||
* |a:| => |a|,||
* @author FangYidong<fangyidong@yahoo.com.cn>
*/
public class ItemList {
private String sp=",";
List items=new ArrayList();
public ItemList(){}
public ItemList(String s){
this.split(s,sp,items);
}
public ItemList(String s,String sp){
this.sp=s;
this.split(s,sp,items);
}
public ItemList(String s,String sp,boolean isMultiToken){
split(s,sp,items,isMultiToken);
}
public List getItems(){
return this.items;
}
public String[] getArray(){
return (String[])this.items.toArray();
}
public void split(String s,String sp,List append,boolean isMultiToken){
if(s==null || sp==null)
return;
if(isMultiToken){
StringTokenizer tokens=new StringTokenizer(s,sp);
while(tokens.hasMoreTokens()){
append.add(tokens.nextToken().trim());
}
}
else{
this.split(s,sp,append);
}
}
public void split(String s,String sp,List append){
if(s==null || sp==null)
return;
int pos=0;
int prevPos=0;
do{
prevPos=pos;
pos=s.indexOf(sp,pos);
if(pos==-1)
break;
append.add(s.substring(prevPos,pos).trim());
pos+=sp.length();
}while(pos!=-1);
append.add(s.substring(prevPos).trim());
}
public void setSP(String sp){
this.sp=sp;
}
public void add(int i,String item){
if(item==null)
return;
items.add(i,item.trim());
}
public void add(String item){
if(item==null)
return;
items.add(item.trim());
}
public void addAll(ItemList list){
items.addAll(list.items);
}
public void addAll(String s){
this.split(s,sp,items);
}
public void addAll(String s,String sp){
this.split(s,sp,items);
}
public void addAll(String s,String sp,boolean isMultiToken){
this.split(s,sp,items,isMultiToken);
}
/**
* @param i 0-based
* @return
*/
public String get(int i){
return (String)items.get(i);
}
public int size(){
return items.size();
}
public String toString(){
return toString(sp);
}
public String toString(String sp){
StringBuffer sb=new StringBuffer();
for(int i=0;i<items.size();i++){
if(i==0)
sb.append(items.get(i));
else{
sb.append(sp);
sb.append(items.get(i));
}
}
return sb.toString();
}
public void clear(){
items.clear();
}
public void reset(){
sp=",";
items.clear();
}
}

View File

@@ -13,19 +13,21 @@ import java.util.Iterator;
*/
public class JSONArray extends ArrayList {
public String toString(){
ItemList list=new ItemList();
Iterator iter=iterator();
boolean first = true;
StringBuffer sb = new StringBuffer();
sb.append('[');
while(iter.hasNext()){
Object value=iter.next();
if(value instanceof String){
list.add("\""+JSONObject.escape((String)value)+"\"");
}
else
list.add(String.valueOf(value));
if (first) {
first = false;
} else {
sb.append(',');
}
JSONObject.escapeValue(iter.next(), sb);
}
return "["+list.toString()+"]";
sb.append(']');
return sb.toString();
}
}

View File

@@ -14,37 +14,47 @@ import java.util.Map;
public class JSONObject extends HashMap{
public String toString(){
ItemList list=new ItemList();
Iterator iter=entrySet().iterator();
boolean first = true;
StringBuffer sb = new StringBuffer();
sb.append('{');
while(iter.hasNext()){
if (first) {
first = false;
} else {
sb.append(',');
}
Map.Entry entry=(Map.Entry)iter.next();
list.add(toString(entry.getKey().toString(),entry.getValue()));
toString(entry.getKey().toString(), entry.getValue(), sb);
}
return "{"+list.toString()+"}";
sb.append('}');
return sb.toString();
}
public static String toString(String key,Object value){
StringBuffer sb=new StringBuffer();
public static String toString(String key, Object value){
return toString(key, value, new StringBuffer()).toString();
}
sb.append("\"");
sb.append(escape(key));
private static StringBuffer toString(String key, Object value, StringBuffer sb){
sb.append('\"');
escape(key, sb);
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();
escapeValue(value, sb);
return sb;
}
// Package-protected for JSONArray
static void escapeValue(Object value, StringBuffer sb) {
if (value instanceof String){
sb.append('\"');
escape((String) value, sb);
sb.append('\"');
} else {
sb.append(String.valueOf(value));
}
}
/**
* " => \" , \ => \\
* @param s
@@ -53,7 +63,13 @@ public class JSONObject extends HashMap{
public static String escape(String s){
if(s==null)
return null;
StringBuffer sb=new StringBuffer();
StringBuffer sb = new StringBuffer();
escape(s, sb);
return sb.toString();
}
// Package-protected for JSONArray
static void escape(String s, StringBuffer sb) {
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
switch(ch){
@@ -104,6 +120,5 @@ public class JSONObject extends HashMap{
}
}
}//for
return sb.toString();
}
}