Introduced toJson() method
This commit is contained in:
		@@ -25,6 +25,7 @@ public class MPArray<T extends MPType> implements MPType<List<T>>, List<T> {
 | 
			
		||||
        this.array = array;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @SafeVarargs
 | 
			
		||||
    public MPArray(T... objects) {
 | 
			
		||||
        this.array = Arrays.asList(objects);
 | 
			
		||||
    }
 | 
			
		||||
@@ -179,17 +180,29 @@ public class MPArray<T extends MPType> implements MPType<List<T>>, List<T> {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return toJson();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return toJson("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    String toJson(String indent) {
 | 
			
		||||
        StringBuilder result = new StringBuilder();
 | 
			
		||||
        result.append('[');
 | 
			
		||||
        result.append("[\n");
 | 
			
		||||
        Iterator<T> iterator = array.iterator();
 | 
			
		||||
        String indent2 = indent + "  ";
 | 
			
		||||
        while (iterator.hasNext()) {
 | 
			
		||||
            T item = iterator.next();
 | 
			
		||||
            result.append(item.toString());
 | 
			
		||||
            result.append(indent2);
 | 
			
		||||
            result.append(Utils.toJson(item, indent2));
 | 
			
		||||
            if (iterator.hasNext()) {
 | 
			
		||||
                result.append(", ");
 | 
			
		||||
                result.append(',');
 | 
			
		||||
            }
 | 
			
		||||
            result.append('\n');
 | 
			
		||||
        }
 | 
			
		||||
        result.append(']');
 | 
			
		||||
        result.append("]");
 | 
			
		||||
        return result.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -52,7 +52,12 @@ public class MPBinary implements MPType<byte[]> {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return null; // TODO base64
 | 
			
		||||
        return toJson();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return Utils.base64(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPBinary> {
 | 
			
		||||
 
 | 
			
		||||
@@ -48,6 +48,11 @@ public class MPBoolean implements MPType<Boolean> {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPBoolean> {
 | 
			
		||||
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,11 @@ public class MPDouble implements MPType<Double> {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPDouble> {
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
            return firstByte == 0xCB;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,11 @@ public class MPFloat implements MPType<Float> {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPFloat> {
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
            return firstByte == 0xCA;
 | 
			
		||||
 
 | 
			
		||||
@@ -78,6 +78,11 @@ public class MPInteger implements MPType<Long> {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return String.valueOf(value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPInteger> {
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
            switch (firstByte) {
 | 
			
		||||
 
 | 
			
		||||
@@ -123,22 +123,34 @@ public class MPMap<K extends MPType, V extends MPType> implements MPType<Map<K,
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toString() {
 | 
			
		||||
        return toJson();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    String toJson(String indent) {
 | 
			
		||||
        StringBuilder result = new StringBuilder();
 | 
			
		||||
        result.append('{');
 | 
			
		||||
        result.append("{\n");
 | 
			
		||||
        Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
 | 
			
		||||
        String indent2 = indent + "  ";
 | 
			
		||||
        while (iterator.hasNext()) {
 | 
			
		||||
            Map.Entry<K, V> item = iterator.next();
 | 
			
		||||
            result.append(item.getKey().toString());
 | 
			
		||||
            result.append(indent2);
 | 
			
		||||
            result.append(Utils.toJson(item.getKey(), indent2));
 | 
			
		||||
            result.append(": ");
 | 
			
		||||
            result.append(item.getValue().toString());
 | 
			
		||||
            result.append(Utils.toJson(item.getValue(), indent2));
 | 
			
		||||
            if (iterator.hasNext()) {
 | 
			
		||||
                result.append(", ");
 | 
			
		||||
                result.append(',');
 | 
			
		||||
            }
 | 
			
		||||
            result.append('\n');
 | 
			
		||||
        }
 | 
			
		||||
        result.append('}');
 | 
			
		||||
        result.append(indent).append("}");
 | 
			
		||||
        return result.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return toJson("");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPMap> {
 | 
			
		||||
        private final Reader reader;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,11 @@ public class MPNil implements MPType<Void> {
 | 
			
		||||
        return "null";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        return "null";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPNil> {
 | 
			
		||||
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
 
 | 
			
		||||
@@ -99,6 +99,50 @@ public class MPString implements MPType<String>, CharSequence {
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String toJson() {
 | 
			
		||||
        StringBuilder result = new StringBuilder(value.length() + 4);
 | 
			
		||||
        result.append('"');
 | 
			
		||||
        for (int i = 0; i < value.length(); i++) {
 | 
			
		||||
            char c = value.charAt(i);
 | 
			
		||||
            switch (c) {
 | 
			
		||||
                case '\\':
 | 
			
		||||
                case '"':
 | 
			
		||||
                case '/':
 | 
			
		||||
                    result.append('\\').append(c);
 | 
			
		||||
                    break;
 | 
			
		||||
                case '\b':
 | 
			
		||||
                    result.append("\\b");
 | 
			
		||||
                    break;
 | 
			
		||||
                case '\t':
 | 
			
		||||
                    result.append("\\t");
 | 
			
		||||
                    break;
 | 
			
		||||
                case '\n':
 | 
			
		||||
                    result.append("\\n");
 | 
			
		||||
                    break;
 | 
			
		||||
                case '\f':
 | 
			
		||||
                    result.append("\\f");
 | 
			
		||||
                    break;
 | 
			
		||||
                case '\r':
 | 
			
		||||
                    result.append("\\r");
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    if (c < ' ') {
 | 
			
		||||
                        result.append("\\u");
 | 
			
		||||
                        String hex = Integer.toHexString(c);
 | 
			
		||||
                        for (int j = 0; j - hex.length() < 4; j++) {
 | 
			
		||||
                            result.append('0');
 | 
			
		||||
                        }
 | 
			
		||||
                        result.append(hex);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        result.append(c);
 | 
			
		||||
                    }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        result.append('"');
 | 
			
		||||
        return result.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static class Unpacker implements MPType.Unpacker<MPString> {
 | 
			
		||||
        public boolean is(int firstByte) {
 | 
			
		||||
            return firstByte == STR8_PREFIX || firstByte == STR16_PREFIX || firstByte == STR32_PREFIX
 | 
			
		||||
 
 | 
			
		||||
@@ -17,4 +17,6 @@ public interface MPType<T> {
 | 
			
		||||
    T getValue();
 | 
			
		||||
 | 
			
		||||
    void pack(OutputStream out) throws IOException;
 | 
			
		||||
 | 
			
		||||
    String toJson();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,8 @@ import java.io.InputStream;
 | 
			
		||||
import java.nio.ByteBuffer;
 | 
			
		||||
 | 
			
		||||
class Utils {
 | 
			
		||||
    private static final char[] BASE64_CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns a {@link ByteBuffer} containing the next <code>count</code> bytes from the {@link InputStream}.
 | 
			
		||||
     */
 | 
			
		||||
@@ -20,4 +22,49 @@ class Utils {
 | 
			
		||||
        }
 | 
			
		||||
        return ByteBuffer.wrap(result);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper method to decide which types support extra indention (for pretty printing JSON)
 | 
			
		||||
     */
 | 
			
		||||
    static String toJson(MPType<?> type, String indent) {
 | 
			
		||||
        if (type instanceof MPMap) {
 | 
			
		||||
            return ((MPMap) type).toJson(indent);
 | 
			
		||||
        }
 | 
			
		||||
        if (type instanceof MPArray) {
 | 
			
		||||
            return ((MPArray) type).toJson(indent);
 | 
			
		||||
        }
 | 
			
		||||
        return type.toJson();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Slightly improved code from https://en.wikipedia.org/wiki/Base64
 | 
			
		||||
     */
 | 
			
		||||
    static String base64(byte[] data) {
 | 
			
		||||
        StringBuilder result = new StringBuilder((data.length * 4) / 3 + 3);
 | 
			
		||||
        int b;
 | 
			
		||||
        for (int i = 0; i < data.length; i += 3) {
 | 
			
		||||
            b = (data[i] & 0xFC) >> 2;
 | 
			
		||||
            result.append(BASE64_CODES[b]);
 | 
			
		||||
            b = (data[i] & 0x03) << 4;
 | 
			
		||||
            if (i + 1 < data.length) {
 | 
			
		||||
                b |= (data[i + 1] & 0xF0) >> 4;
 | 
			
		||||
                result.append(BASE64_CODES[b]);
 | 
			
		||||
                b = (data[i + 1] & 0x0F) << 2;
 | 
			
		||||
                if (i + 2 < data.length) {
 | 
			
		||||
                    b |= (data[i + 2] & 0xC0) >> 6;
 | 
			
		||||
                    result.append(BASE64_CODES[b]);
 | 
			
		||||
                    b = data[i + 2] & 0x3F;
 | 
			
		||||
                    result.append(BASE64_CODES[b]);
 | 
			
		||||
                } else {
 | 
			
		||||
                    result.append(BASE64_CODES[b]);
 | 
			
		||||
                    result.append('=');
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                result.append(BASE64_CODES[b]);
 | 
			
		||||
                result.append("==");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return result.toString();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1,4 @@
 | 
			
		||||
{"compact": true, "schema": 0}
 | 
			
		||||
{
 | 
			
		||||
  "compact": true,
 | 
			
		||||
  "schema": 0
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user