Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 55 additions & 2 deletions src/java/mjson/Json.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
package mjson;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
Expand Down Expand Up @@ -252,7 +254,7 @@
* @author Borislav Iordanov
* @version 2.0.0
*/
public class Json implements java.io.Serializable, Iterable<Json>
public abstract class Json implements java.io.Serializable, Iterable<Json>
{
private static final long serialVersionUID = 1L;

Expand Down Expand Up @@ -425,6 +427,8 @@ public static interface Schema
*/
//Json generate(Json options);
}

public abstract void write(Writer writer) throws IOException;

@Override
public Iterator<Json> iterator()
Expand Down Expand Up @@ -1893,6 +1897,10 @@ static class NullJson extends Json
public Object getValue() { return null; }
public Json dup() { return new NullJson(); }
public boolean isNull() { return true; }
public void write(Writer writer) throws IOException
{
writer.write("null");
}
public String toString() { return "null"; }
public List<Object> asList() { return (List<Object>)Collections.singletonList(null); }

Expand Down Expand Up @@ -1975,8 +1983,11 @@ static class BooleanJson extends Json
public Json dup() { return new BooleanJson(val, null); }
public boolean asBoolean() { return val; }
public boolean isBoolean() { return true; }
public void write(Writer writer) throws IOException
{
writer.write(val ? "true" : "false");
}
public String toString() { return val ? "true" : "false"; }

@SuppressWarnings("unchecked")
public List<Object> asList() { return (List<Object>)(List<?>)Collections.singletonList(val); }
public int hashCode() { return val ? 1 : 0; }
Expand Down Expand Up @@ -2021,6 +2032,10 @@ static class StringJson extends Json
@SuppressWarnings("unchecked")
public List<Object> asList() { return (List<Object>)(List<?>)Collections.singletonList(val); }

public void write(Writer writer) throws IOException
{
writer.write('"' + escaper.escapeJsonString(val) + '"');
}
public String toString()
{
return '"' + escaper.escapeJsonString(val) + '"';
Expand All @@ -2032,6 +2047,7 @@ public String toString(int maxCharacters)
else
return '"' + escaper.escapeJsonString(val.subSequence(0, maxCharacters)) + "...\"";
}


public int hashCode() { return val.hashCode(); }
public boolean equals(Object x)
Expand Down Expand Up @@ -2076,6 +2092,10 @@ static class NumberJson extends Json
@SuppressWarnings("unchecked")
public List<Object> asList() { return (List<Object>)(List<?>)Collections.singletonList(val); }

public void write(Writer writer) throws IOException
{
writer.write(val.toString());
}
public String toString() { return val.toString(); }
public int hashCode() { return val.hashCode(); }
public boolean equals(Object x)
Expand Down Expand Up @@ -2291,6 +2311,18 @@ public Json delAt(int index)
return this;
}

public void write(Writer writer) throws IOException
{
writer.write("[");
for (Iterator<Json> i = L.iterator(); i.hasNext(); )
{
Json value = i.next();
value.write(writer);
if (i.hasNext())
writer.write(",");
}
writer.write("]");
}
public String toString()
{
return toString(Integer.MAX_VALUE);
Expand All @@ -2301,6 +2333,7 @@ public String toString(int maxCharacters)
return toStringImpl(maxCharacters, new IdentityHashMap<Json, Json>());
}


String toStringImpl(int maxCharacters, Map<Json, Json> done)
{
StringBuilder sb = new StringBuilder("[");
Expand Down Expand Up @@ -2468,6 +2501,25 @@ public Map<String, Object> asMap()
@Override
public Map<String, Json> asJsonMap() { return object; }

public void write(Writer writer) throws IOException
{
writer.write("{");
for (Iterator<Map.Entry<String, Json>> i = object.entrySet().iterator(); i.hasNext(); )
{
Map.Entry<String, Json> entry = i.next();
String key = entry.getKey();
Json value = entry.getValue();
writer.append('"');
writer.append(escaper.escapeJsonString(key));
writer.write('"');
writer.write(":");
value.write(writer);
if (i.hasNext())
writer.write(",");
}
writer.write("}");
}

public String toString()
{
return toString(Integer.MAX_VALUE);
Expand Down Expand Up @@ -2508,6 +2560,7 @@ String toStringImpl(int maxCharacters, Map<Json, Json> done)
sb.append("}");
return sb.toString();
}

public int hashCode() { return object.hashCode(); }
public boolean equals(Object x)
{
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/testmjson/TestWriter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package testmjson;

import static org.junit.Assert.assertEquals;

import java.io.IOException;
import java.io.StringWriter;

import org.junit.Test;

import mjson.Json;

public class TestWriter
{
@Test
public void testWrite() throws IOException
{
String jsonString = TestSchemas.readTextResource("/suite/additionalProperties.json");
Json json = Json.read(jsonString);
StringWriter writer = new StringWriter();
json.write(writer);
assertEquals(json.toString(), writer.toString());
}

}