package org.jboss.resteasy.plugins.providers.jaxb.json; import org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException; import org.jboss.resteasy.plugins.providers.jaxb.json.i18n.Messages; import java.io.IOException; import java.io.Reader; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class JsonParsing { public static String extractJsonMapString(Reader reader) throws IOException { int openBrace = 1; boolean quote = false; boolean backslash = false; int i = reader.read(); char c = (char) i; StringBuffer buffer = new StringBuffer(); if (c != '{') throw new JAXBUnmarshalException(Messages.MESSAGES.expectingLeftBraceJsonMap()); buffer.append(c); do { i = reader.read(); if (i == -1) throw new JAXBUnmarshalException(Messages.MESSAGES.unexpectedEndOfStream()); c = (char) i; buffer.append(c); if (backslash) { backslash = false; } else { switch (c) { case '"': { quote = !quote; break; } case '{': { if (!quote) openBrace++; break; } case '}': { if (!quote) openBrace--; break; } case '\\': { backslash = true; break; } } } } while (openBrace > 0 && i != -1); return buffer.toString(); } public static String getJsonString(Reader reader) throws IOException { boolean quote = true; boolean backslash = false; int i = reader.read(); char c = (char) i; StringBuffer buffer = new StringBuffer(); if (c != '"') throw new JAXBUnmarshalException(Messages.MESSAGES.expectingQuote()); do { i = reader.read(); if (i == -1) throw new JAXBUnmarshalException(Messages.MESSAGES.unexpectedEndOfStream()); c = (char) i; if (backslash) { buffer.append(c); backslash = false; } else { switch (c) { case '"': { quote = false; break; } case '\\': { backslash = true; break; } default: buffer.append(c); break; } } } while (quote && i != -1); return buffer.toString(); } protected static char eatWhitspace(Reader buffer, boolean reset) throws IOException { int i; char c; do { buffer.mark(2); i = buffer.read(); if (i == -1) throw new JAXBUnmarshalException(Messages.MESSAGES.unexpectedEndOfJsonInput()); c = (char) i; } while (Character.isWhitespace(c)); if (reset) buffer.reset(); return c; } }