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.JSONWriter, 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.Map;
 import java.util.Set;
 
 public class JSONWriter {
     private boolean indentMode = false;
     private int indentLevel = 0;
     private StringBuilder buf = new StringBuilder();
 
     public JSONWriter() {}
 
     public JSONWriter(boolean indenting) {
          = indenting;
     }
 
     public boolean getIndentMode() {
         return ;
     }
 
     public void setIndentMode(boolean value) {
          = value;
     }
 
     private void newline() {
         if () {
             add('\n');
             for (int i = 0; i < i++) add(' ');
         }
     }
 
     public String write(Object object) {
         .setLength(0);
         value(object);
         return .toString();
     }
 
     public String write(long n) {
         return write(new Long(n));
     }
 
     public Object write(double d) {
         return write(new Double(d));
     }
 
     public String write(char c) {
         return write(new Character(c));
     }
 
     public String write(boolean b) {
         return write(Boolean.valueOf(b));
     }
 
     @SuppressWarnings("unchecked")
     private void value(Object object) {
         if (object == nulladd("null");
         else if (object instanceof JSONSerializable) {
             ((JSONSerializableobject).jsonSerialize(this);
         } else if (object instanceof Classstring(object);
         else if (object instanceof Booleanbool(((Booleanobject).booleanValue());
         else if (object instanceof Numberadd(object);
         else if (object instanceof Stringstring(object);
         else if (object instanceof Characterstring(object);
         else if (object instanceof Mapmap((Map<StringObject>) object);
        else if (object.getClass().isArray()) array(object);
        else if (object instanceof Collectionarray(((Collection<?>) object).iterator());
        else bean(object);
    }
    private void bean(Object object) {
        writeLimited(object.getClass(), objectnull);
    }

    
Write only a certain subset of the object's properties and fields.

Parameters:
klass the class to look up properties etc in
object the object
properties explicit list of property/field names to include - may be null for "all"
    public void writeLimited(Class<?> klassObject objectString[] properties) {
        Set<StringpropertiesSet = null;
        if (properties != null) {
            propertiesSet = new HashSet<String>();
            for (String pproperties) {
                propertiesSet.add(p);
            }
        }
        add('{');  += 2; newline();
        boolean needComma = false;
        BeanInfo info;
        try {
            info = Introspector.getBeanInfo(klass);
        } catch (IntrospectionException ie) {
            info = null;
        }
        if (info != null) {
            PropertyDescriptor[] props = info.getPropertyDescriptors();
            for (int i = 0; i < props.length; ++i) {
                PropertyDescriptor prop = props[i];
                String name = prop.getName();
                if (propertiesSet == null && name.equals("class")) {
                    // We usually don't want the class in there.
                    continue;
                }
                if (propertiesSet == null || propertiesSet.contains(name)) {
                    Method accessor = prop.getReadMethod();
                    if (accessor != null && !Modifier.isStatic(accessor.getModifiers())) {
                        try {
                            Object value = accessor.invoke(object, (Object[])null);
                            if (needComma) { add(','); newline(); }
                            needComma = true;
                            add(namevalue);
                        } catch (Exception e) {
                            // Ignore it.
                        }
                    }
                }
            }
        }
        Field[] ff = object.getClass().getDeclaredFields();
        for (int i = 0; i < ff.length; ++i) {
            Field field = ff[i];
            int fieldMod = field.getModifiers();
            String name = field.getName();
            if (propertiesSet == null || propertiesSet.contains(name)) {
                if (!Modifier.isStatic(fieldMod)) {
                    try {
                        Object v = field.get(object);
                        if (needComma) { add(','); newline(); }
                        needComma = true;
                        add(namev);
                    } catch (Exception e) {
                        // Ignore it.
                    }
                }
            }
        }
         -= 2; newline(); add('}');
    }
    private void add(String nameObject value) {
        add('"');
        add(name);
        add("\":");
        value(value);
    }
    private void map(Map<StringObjectmap) {
        add('{');  += 2; newline();
        Iterator<Stringit = map.keySet().iterator();
        if (it.hasNext()) {
            mapEntry(it.next(), map);
        }
        while (it.hasNext()) {
            add(','); newline();
            Object key = it.next();
            value(key);
            add(':');
            value(map.get(key));
        }
         -= 2; newline(); add('}');
    }
    private void mapEntry(Object keyMap<StringObjectmap) {
        value(key);
        add(':');
        value(map.get(key));
    }
    private void array(Iterator<?> it) {
        add('[');
        if (it.hasNext()) value(it.next());
        while (it.hasNext()) {
            add(',');
            value(it.next());
        }
        add(']');
    }
    private void array(Object object) {
        add('[');
        int length = Array.getLength(object);
        if (length > 0) value(Array.get(object, 0));
        for (int i = 1; i < length; ++i) {
            add(',');
            value(Array.get(objecti));
        }
        add(']');
    }
    private void bool(boolean b) {
        add(b ? "true" : "false");
    }
    private void string(Object obj) {
        add('"');
        CharacterIterator it = new StringCharacterIterator(obj.toString());
        for (char c = it.first(); c != .c = it.next()) {
            if (c == '"'add("\\\"");
            else if (c == '\\'add("\\\\");
            else if (c == '/'add("\\/");
            else if (c == '\b'add("\\b");
            else if (c == '\f'add("\\f");
            else if (c == '\n'add("\\n");
            else if (c == '\r'add("\\r");
            else if (c == '\t'add("\\t");
            else if (Character.isISOControl(c)) {
                unicode(c);
            } else {
                add(c);
            }
        }
        add('"');
    }
    private void add(Object obj) {
        .append(obj);
    }
    private void add(char c) {
        .append(c);
    }
    static char[] hex = "0123456789ABCDEF".toCharArray();
    private void unicode(char c) {
        add("\\u");
        int n = c;
        for (int i = 0; i < 4; ++i) {
            int digit = (n & 0xf000) >> 12;
            add([digit]);
            n <<= 4;
        }
    }
New to GrepCode? Check out our FAQ X