view src/luan/modules/parsers/Json.java @ 1112:490f77bb2ad1

add JsonParser
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 02 Aug 2017 17:37:59 -0600
parents 88b5b81cad4a
children
line wrap: on
line source

package luan.modules.parsers;

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.Iterator;
import luan.LuanTable;
import luan.LuanException;
import luan.lib.parser.Parser;
import luan.lib.parser.ParseException;


public final class Json {

	public static String toString(Object obj) throws LuanException {
		StringBuilder sb = new StringBuilder();
		toString(obj,sb);
		return sb.toString();
	}

	private static void toString(Object obj,StringBuilder sb) throws LuanException {
		if( obj == null || obj instanceof Boolean || obj instanceof Number ) {
			sb.append(obj);
			return;
		}
		if( obj instanceof String ) {
			toString((String)obj,sb);
			return;
		}
		if( obj instanceof LuanTable ) {
			toString((LuanTable)obj,sb);
			return;
		}
		throw new LuanException("can't handle type "+obj.getClass().getName());
	}

	private static void toString(final String s,StringBuilder sb) {
		sb.append('"');
		for( int i=0; i<s.length(); i++ ) {
			char c = s.charAt(i);
			switch(c) {
			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;
			default:
				sb.append(c);
			}
		}
		sb.append('"');
	}

	private static void toString(LuanTable t,StringBuilder sb) throws LuanException {
		if( t.isList() ) {
			final List list = t.asList();
			if( list.isEmpty() ) {
				sb.append("{}");
				return;
			}
			sb.append('[');
			toString(list.get(0),sb);
			for( int i=1; i<list.size(); i++ ) {
				sb.append(',');
				toString(list.get(i),sb);
			}
			sb.append(']');
			return;
		}
		sb.append('{');
		Iterator<Map.Entry<Object,Object>> i = t.rawIterator();
		toString(i.next(),sb);
		while( i.hasNext() ) {
			sb.append(',');
			toString(i.next(),sb);
		}
		sb.append('}');
	}

	private static void toString(Map.Entry<Object,Object> entry,StringBuilder sb) throws LuanException {
		Object key = entry.getKey();
		if( !(key instanceof String) )
			throw new LuanException("table keys must be strings");
		toString((String)key,sb);
		sb.append(':');
		toString(entry.getValue(),sb);
	}

}