Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
  Copyright 2006, 2007 Frank Carver
  Copyright 2007 Tony Garnock-Jones
  
     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at
  
         http://www.apache.org/licenses/LICENSE-2.0
 
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
 */
 /*
  * Based on org.stringtree.json.JSONReader, licensed under APL and
  * LGPL. We've chosen APL (see above). The original code was written
  * by Frank Carver. Tony Garnock-Jones has made many changes to it
  * since then.
  */
 package com.rabbitmq.tools.json;
 
 import java.util.List;
 import java.util.Map;
 
 public class JSONReader {
 
     private static final Object OBJECT_END = new Object();
     private static final Object ARRAY_END = new Object();
     private static final Object COLON = new Object();
     private static final Object COMMA = new Object();
 
     private static Map<CharacterCharacterescapes = new HashMap<CharacterCharacter>();
     static {
         .put(new Character('"'), new Character('"'));
         .put(new Character('\\'), new Character('\\'));
         .put(new Character('/'), new Character('/'));
         .put(new Character('b'), new Character('\b'));
         .put(new Character('f'), new Character('\f'));
         .put(new Character('n'), new Character('\n'));
         .put(new Character('r'), new Character('\r'));
         .put(new Character('t'), new Character('\t'));
     }
 
     private CharacterIterator it;
     private char c;
     private Object token;
     private StringBuilder buf = new StringBuilder();
 
     private char next() {
          = .next();
         return ;
     }
 
     private void skipWhiteSpace() {
         while (Character.isWhitespace()) {
             next();
         }
     }
 
     public Object read(String string) {
          = new StringCharacterIterator(string);
          = .first();
         return read();
     }
 
     private Object read() {
         Object ret = null;
         skipWhiteSpace();
 
         if ( == '"') {
             next();
             ret = string();
         } else if ( == '[') {
             next();
             ret = array();
         } else if ( == ']') {
             ret = ;
             next();
         } else if ( == ',') {
             ret = ;
             next();
         } else if ( == '{') {
             next();
             ret = object();
         } else if ( == '}') {
             ret = ;
             next();
         } else if ( == ':') {
             ret = ;
             next();
         } else if ( == 't' && next() == 'r' && next() == 'u' && next() == 'e') {
             ret = .;
	    next();
        } else if ( == 'f' && next() == 'a' && next() == 'l' && next() == 's' && next() == 'e') {
            ret = .;
	    next();
        } else if ( == 'n' && next() == 'u' && next() == 'l' && next() == 'l') {
	    next();
        } else if (Character.isDigit() ||  == '-') {
            ret = number();
        }
        // System.out.println("token: " + ret); // enable this line to see the token stream
         = ret;
        return ret;
    }
    private Object object() {
        Map<StringObjectret = new HashMap<StringObject>();
        String key = (Stringread(); // JSON keys must be strings
        while ( != ) {
            read(); // should be a colon
            if ( != ) {
                ret.put(keyread());
                if (read() == ) {
                    key = (Stringread();
                }
            }
        }
        return ret;
    }
    private Object array() {
        List<Objectret = new ArrayList<Object>();
        Object value = read();
        while ( != ) {
            ret.add(value);
            if (read() == ) {
                value = read();
            }
        }
        return ret;
    }
    private Object number() {
        .setLength(0);
        if ( == '-') {
            add();
        }
        addDigits();
        if ( == '.') {
            add();
            addDigits();
        }
        if ( == 'e' ||  == 'E') {
            add();
            if ( == '+' ||  == '-') {
                add();
            }
            addDigits();
        }
	String result = .toString();
	try {
	    return new Integer(result);
catch (NumberFormatException nfe) {
	    return new Double(result);
	}
    }
    private Object string() {
        .setLength(0);
        while ( != '"') {
            if ( == '\\') {
                next();
                if ( == 'u') {
                    add(unicode());
                } else {
                    Object value = .get(new Character());
                    if (value != null) {
                        add(((Charactervalue).charValue());
                    }
                }
            } else {
                add();
            }
        }
        next();
        return .toString();
    }
    private void add(char cc) {
        .append(cc);
        next();
    }
    private void add() {
        add();
    }
    private void addDigits() {
        while (Character.isDigit()) {
            add();
        }
    }
    private char unicode() {
        int value = 0;
        for (int i = 0; i < 4; ++i) {
            switch (next()) {
            case '0'case '1'case '2'case '3'case '4'
            case '5'case '6'case '7'case '8'case '9':
                value = (value << 4) +  - '0';
                break;
            case 'a'case 'b'case 'c'case 'd'case 'e'case 'f':
                value = (value << 4) +  - 'a' + 10;
                break;
            case 'A'case 'B'case 'C'case 'D'case 'E'case 'F':
                value = (value << 4) +  - 'A' + 10;
                break;
            }
        }
        return (charvalue;
    }
New to GrepCode? Check out our FAQ X