Author: yonik
Date: Thu Feb 10 21:41:43 2011
New Revision: 1069578
URL: http://svn.apache.org/viewvc?rev=1069578&view=rev
Log:
merge TextSerializer into TextWriter, add better support for serializing common
objects, fix an infinite recursion bug when serializing Object[]
Removed:
labs/noggit/src/main/java/org/apache/noggit/TextSerializer.java
Modified:
labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java
labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java
labs/noggit/src/main/java/org/apache/noggit/TextWriter.java
labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java
Modified: labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java
URL:
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java Thu Feb 10
21:41:43 2011
@@ -35,18 +35,24 @@ public class JSONUtil {
public static final char ARRAY_END = ']';
public static String toJSON(Object o) {
- CharArr out = new CharArr();
- new TextSerializer().serialize(new JSONWriter(out), o);
+ CharArr out = new CharArr();
+ new JSONWriter(out).write(o);
return out.toString();
-
}
+ public static void writeNumber(int number, CharArr out) {
+ out.write(Integer.toString(number));
+ }
public static void writeNumber(long number, CharArr out) {
out.write(Long.toString(number));
}
+ public static void writeNumber(float number, CharArr out) {
+ out.write(Float.toString(number));
+ }
+
public static void writeNumber(double number, CharArr out) {
out.write(Double.toString(number));
}
Modified: labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java
URL:
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java Thu Feb 10
21:41:43 2011
@@ -70,14 +70,27 @@ public class JSONWriter extends TextWrit
JSONUtil.writeNumber(number,out);
}
+ public void write(int number) {
+ JSONUtil.writeNumber(number,out);
+ }
+
public void write(double number) {
JSONUtil.writeNumber(number,out);
}
+ public void write(float number) {
+ JSONUtil.writeNumber(number,out);
+ }
+
public void write(boolean bool) {
JSONUtil.writeBoolean(bool,out);
}
+ @Override
+ public void write(char[] val) {
+ JSONUtil.writeString(val, 0, val.length, out);
+ }
+
public void writeNumber(CharArr digits) {
out.write(digits);
}
Modified: labs/noggit/src/main/java/org/apache/noggit/TextWriter.java
URL:
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/TextWriter.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/TextWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/TextWriter.java Thu Feb 10
21:41:43 2011
@@ -35,11 +35,21 @@ public abstract class TextWriter {
public abstract void writeStringEnd();
public abstract void write(long number);
+ public abstract void write(int number);
+ public void write(short number) { write ((int)number); }
+ public void write(byte number) { write((int)number); }
public abstract void write(double number);
+ public abstract void write(float number);
public abstract void write(boolean bool);
+
+ /** A char[] may be either be a string, or a list of characters.
+ * It's up to the implementation to decide.
+ */
+ public abstract void write(char[] val);
+
public abstract void writeNumber(CharArr digits);
public abstract void writePartialNumber(CharArr digits);
@@ -56,6 +66,180 @@ public abstract class TextWriter {
public abstract void writeNameSeparator();
- // void writeNameValue(String name, Object val)?
+ public void write(Object o) {
+ if (o == null) {
+ writeNull();
+ } else if (o instanceof CharSequence) {
+ writeString((CharSequence)o);
+ } else if (o instanceof Number) {
+ if (o instanceof Integer || o instanceof Long) {
+ write(((Number)o).longValue());
+ } else if (o instanceof Float || o instanceof Double) {
+ write(((Number)o).doubleValue());
+ } else {
+ CharArr arr = new CharArr();
+ arr.write(o.toString());
+ writeNumber(arr);
+ }
+ } else if (o instanceof Map) {
+ write((Map)o);
+ } else if (o instanceof Collection) {
+ write((Collection)o);
+ } else if (o instanceof Object[]) {
+ write(Arrays.asList((Object[])o));
+ } else if (o instanceof Boolean) {
+ write(((Boolean)o).booleanValue());
+ } else if (o instanceof int[]) {
+ write((int[])o);
+ } else if (o instanceof float[]) {
+ write((float[])o);
+ } else if (o instanceof long[]) {
+ write((long[])o);
+ } else if (o instanceof double[]) {
+ write((double[])o);
+ } else if (o instanceof short[]) {
+ write((short[])o);
+ } else if (o instanceof boolean[]) {
+ write((boolean[])o);
+ } else if (o instanceof char[]) {
+ write((char[])o);
+ } else if (o instanceof byte[]) {
+ write((byte[])o);
+ } else {
+ writeString(o.toString());
+ }
+ }
+
+ public void write(Map val) {
+ startObject();
+ boolean first = true;
+ for (Map.Entry entry : (Set<Map.Entry>)val.entrySet()) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ writeString(entry.getKey().toString());
+ writeNameSeparator();
+ write(entry.getValue());
+ }
+ endObject();
+ }
+
+ public void write(Collection val) {
+ startArray();
+ boolean first = true;
+ for (Object o : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(o);
+ }
+ endArray();
+ }
+
+ /** A byte[] may be either a single logical value, or a list of small
integers.
+ * It's up to the implementation to decide.
+ */
+ public void write(byte[] val) {
+ startArray();
+ boolean first = true;
+ for (short v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(short[] val) {
+ startArray();
+ boolean first = true;
+ for (short v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(int[] val) {
+ startArray();
+ boolean first = true;
+ for (int v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(long[] val) {
+ startArray();
+ boolean first = true;
+ for (long v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(float[] val) {
+ startArray();
+ boolean first = true;
+ for (float v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(double[] val) {
+ startArray();
+ boolean first = true;
+ for (double v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
+ public void write(boolean[] val) {
+ startArray();
+ boolean first = true;
+ for (boolean v : val) {
+ if (first) {
+ first = false;
+ } else {
+ writeValueSeparator();
+ }
+ write(v);
+ }
+ endArray();
+ }
+
}
Modified: labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java
URL:
http://svn.apache.org/viewvc/labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java
(original)
+++ labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java Thu Feb
10 21:41:43 2011
@@ -30,8 +30,7 @@ public class TestObjectBuilder extends T
public void test(String val, Object expected) throws IOException {
val = val.replace('\'','"');
- JSONParser p = TestJSONParser.getParser(val);
- Object v = ObjectBuilder.getVal(p);
+ Object v = ObjectBuilder.fromJSON(val);
String s1 = JSONUtil.toJSON(v);
String s2 = JSONUtil.toJSON(expected);
@@ -44,9 +43,12 @@ public class TestObjectBuilder extends T
assertEquals(s1, s3);
}
- public static List A(Object... lst) {
+ public static List L(Object... lst) {
return Arrays.asList(lst);
}
+ public static Object[] A(Object... lst) {
+ return lst;
+ }
public static Map O(Object... lst) {
LinkedHashMap map = new LinkedHashMap();
for (int i=0; i<lst.length; i+=2) {
@@ -56,21 +58,33 @@ public class TestObjectBuilder extends T
}
public void testVariations(String str, Object expected) throws IOException {
- test("["+str+"]", A(expected));
- test("["+str+","+str+"]", A(expected,expected));
+ test("["+str+"]", L(expected));
+ test("["+str+","+str+"]", L(expected, expected));
+ test("["+str+","+str+"]", A(expected, expected));
test("{'foo':"+str+"}", O("foo",expected));
- test("{'foo':"+str+",'bar':{'a':"+str+"},'baz':["+str+"]}",
- O("foo",expected,"bar",O("a",expected),"baz",A(expected)));
+ test("{'foo':"+str+",'bar':{'a':"+str+"},'baz':["+str+"],'zzz':["+str+"]}",
+ O("foo",expected,"bar",O("a",expected),"baz", L(expected), "zzz",
A(expected)));
}
public void testBuilder() throws IOException {
- testVariations("[]", A());
- testVariations("[]", A());
+ testVariations("[]", L());
+ testVariations("[]", L());
testVariations("{}", O());
- testVariations("[[]]", A(A()));
+ testVariations("[[]]", L(L()));
testVariations("{'foo':{}}", O("foo",O()));
- testVariations("[false,true,1,1.4,null,'hi']",
A(false,true,1,1.4,null,"hi"));
+ testVariations("[false,true,1,1.4,null,'hi']", L(false, true, 1, 1.4,
null, "hi"));
+ testVariations("'hello'", "hello".toCharArray());
+
+ // test array types
+ testVariations("[[10,20],['a','b']]", L(A(10,20),A("a","b")));
+ testVariations("[1,2,3]", new int[]{1,2,3});
+ testVariations("[1,2,3]", new long[]{1,2,3});
+ testVariations("[1.0,2.0,3.0]", new float[]{1,2,3});
+ testVariations("[1.0,2.0,3.0]", new double[]{1,2,3});
+ testVariations("[1,2,3]", new short[]{1,2,3});
+ testVariations("[1,2,3]", new byte[]{1,2,3});
+ testVariations("[false,true,false]", new boolean[]{false,true,false});
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]