Package jodd.json

Source Code of jodd.json.JsonSerializer

// Copyright (c) 2003-2014, Jodd Team (jodd.org). All Rights Reserved.

package jodd.json;

import jodd.util.ArraysUtil;
import jodd.util.InExRules;
import jodd.util.UnsafeUtil;
import jodd.util.buffer.FastCharBuffer;

import java.util.HashMap;
import java.util.Map;

/**
* JSON serializer.
*/
public class JsonSerializer {

  // ---------------------------------------------------------------- config

  protected Map<Path, TypeJsonSerializer> pathSerializersMap;
  protected TypeJsonSerializerMap typeSerializersMap;

  protected InExRules<Path, PathQuery> rules = new InExRules<Path, PathQuery>() {
    @Override
    public boolean accept(Path value, PathQuery rule, boolean include) {
      return rule.matches(value);
    }
  };

  protected String classMetadataName = JoddJson.classMetadataName;
  protected boolean deep = JoddJson.deepSerialization;
  protected Class[] excludedTypes = null;
  protected String[] excludedTypeNames = null;

  /**
   * Defines custom {@link jodd.json.TypeJsonSerializer} for given path.
   */
  public JsonSerializer use(String pathString, TypeJsonSerializer typeJsonSerializer) {
    if (pathSerializersMap == null) {
      pathSerializersMap = new HashMap<Path, TypeJsonSerializer>();
    }

    pathSerializersMap.put(Path.parse(pathString), typeJsonSerializer);

    return this;
  }

  /**
   * Defines custom {@link jodd.json.TypeJsonSerializer} for given type.
   */
  public JsonSerializer use(Class type, TypeJsonSerializer typeJsonSerializer) {
    if (typeSerializersMap == null) {
      typeSerializersMap = new TypeJsonSerializerMap(JoddJson.defaultSerializers);
    }

    typeSerializersMap.register(type, typeJsonSerializer);

    return this;
  }

  /**
   * Adds include path query.
   */
  public JsonSerializer include(String include) {
    rules.include(new PathQuery(include, true));

    return this;
  }

  /**
   * Adds a list of included path queries.
   */
  public JsonSerializer include(String... includes) {
    for (String include : includes) {
      include(include);
    }
    return this;
  }

  /**
   * Adds exclude path query.
   */
  public JsonSerializer exclude(String exclude) {
    rules.exclude(new PathQuery(exclude, false));

    return this;
  }

  /**
   * Adds a list of excluded path queries.
   */
  public JsonSerializer exclude(String... excludes) {
    for (String exclude : excludes) {
      exclude(exclude);
    }
    return this;
  }

  /**
   * Adds excludes with optional parent including. When parents are included,
   * for each exclude query its parent will be included.
   * For example, exclude of 'aaa.bb.ccc' would include it's parent: 'aaa.bb'.
   */
  public JsonSerializer exclude(boolean includeParent, String... excludes) {
    for (String exclude : excludes) {
      if (includeParent) {
        int dotIndex = exclude.lastIndexOf('.');
        if (dotIndex != -1) {
          PathQuery pathQuery = new PathQuery(exclude.substring(0, dotIndex), true);

          rules.include(pathQuery);
        }
      }

      PathQuery pathQuery = new PathQuery(exclude, false);

      rules.exclude(pathQuery);
    }

    return this;
  }

  /**
   * Sets local class meta-data name.
   */
  public JsonSerializer setClassMetadataName(String name) {
    classMetadataName = name;
    return this;
  }

  /**
   * Defines if collections should be followed, i.e. to perform
   * deep serialization.
   */
  public JsonSerializer deep(boolean includeCollections) {
    this.deep = includeCollections;
    return this;
  }

  /**
   * Excludes type names. You can disable
   * serialization of properties that are of some type.
   * For example, you can disable properties of <code>InputStream</code>.
   * You can use wildcards to describe type names.
   */
  public JsonSerializer excludeTypes(String... typeNames) {
    if (excludedTypeNames == null) {
      excludedTypeNames = typeNames;
    } else {
      excludedTypeNames = ArraysUtil.join(excludedTypeNames, typeNames);
    }
    return this;
  }

  /**
   * Excludes types. Supports interfaces and subclasses as well.
   */
  public JsonSerializer excludeTypes(Class... types) {
    if (excludedTypes == null) {
      excludedTypes = types;
    } else {
      excludedTypes = ArraysUtil.join(excludedTypes, types);
    }
    return this;
  }

  // ---------------------------------------------------------------- serialize

  /**
   * Serializes object into provided appendable.
   */
  public void serialize(Object source, Appendable target) {
    JsonContext jsonContext = new JsonContext(this, target);

    jsonContext.serialize(source);
  }

  /**
   * Serializes object into source.
   */
  public String serialize(Object source) {
    FastCharBuffer fastCharBuffer = new FastCharBuffer();

    serialize(source, fastCharBuffer);

    return UnsafeUtil.createString(fastCharBuffer.toArray());
  }

  // ---------------------------------------------------------------- json context

  /**
   * Creates new JSON context.
   */
  public JsonContext createJsonContext(Appendable appendable) {
    return new JsonContext(this, appendable);
  }
}
TOP

Related Classes of jodd.json.JsonSerializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.