001package io.avaje.jsonb;
002
003import java.io.OutputStream;
004import java.io.Writer;
005
006/**
007 * Represents a subset of properties that can be written as json.
008 * <p>
009 * We can use a "view DSL" to dynamically define which properties to include in the
010 * json view.
011 * <p>
012 * Examples of json view DSL:
013 * <pre>{@code
014 *
015 *   // only include the id and name properties
016 *   (id, name)
017 *
018 *   // include billAddress which is a nested type
019 *   (id, name, billingAddress(street, suburb))
020 *
021 *   // include billAddress with all it's properties
022 *   (id, name, billingAddress(*))
023 *
024 *   (id, name, billingAddress(street, suburb), shippingAddress(*), contacts(email,lastName, firstName))
025 *
026 * }</pre>
027 *
028 * @see JsonType#view(String)
029 */
030public interface JsonView<T> {
031
032  /**
033   * Return as json string.
034   */
035  String toJson(T value);
036
037  /**
038   * Return as json string in pretty format.
039   */
040  String toJsonPretty(T value);
041
042  /**
043   * Return the value as json content in bytes form.
044   */
045  byte[] toJsonBytes(T value);
046
047  /**
048   * Write to the given writer.
049   */
050  void toJson(T value, JsonWriter writer);
051
052  /**
053   * Write to the given writer.
054   */
055  void toJson(T value, Writer writer);
056
057  /**
058   * Write to the given outputStream.
059   */
060  void toJson(T value, OutputStream outputStream);
061}