Package org.nutz.json

Source Code of org.nutz.json.Json

package org.nutz.json;

import static org.nutz.lang.Streams.buffr;
import static org.nutz.lang.Streams.fileInr;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.nutz.json.entity.JsonEntity;
import org.nutz.json.impl.JsonRenderImpl;
import org.nutz.lang.Files;
import org.nutz.lang.Lang;
import org.nutz.lang.Mirror;
import org.nutz.lang.Streams;
import org.nutz.lang.util.NutType;
import org.nutz.mapl.Mapl;

public class Json {

    // =========================================================================
    // ============================Json.fromJson================================
    // =========================================================================
    /**
     * 从文本输入流中生成 JAVA 对象。
     *
     * @param reader
     *            文本输入流
     * @return JAVA 对象
     * @throws JsonException
     */
    public static Object fromJson(Reader reader) throws JsonException {
        // return new org.nutz.json.impl.JsonCompileImpl().parse(reader);
        return new org.nutz.json.impl.JsonCompileImplV2().parse(reader);
    }

    /**
     * 根据指定的类型,从文本输入流中生成 JAVA 对象。 指定的类型可以是任意 JAVA 对象。
     *
     * @param type
     *            对象类型
     * @param reader
     *            文本输入流
     * @return 指定类型的 JAVA 对象
     * @throws JsonException
     */
    @SuppressWarnings("unchecked")
    public static <T> T fromJson(Class<T> type, Reader reader)
            throws JsonException {
        return (T) parse(type, reader);
    }

    /**
     * 根据指定的类型,从文本输入流中生成 JAVA 对象。 指定的类型可以是任意 JAVA 对象。
     *
     * @param type
     *            对象类型,可以是范型
     * @param reader
     *            文本输入流
     * @return 指定类型的 JAVA 对象
     * @throws JsonException
     */
    public static Object fromJson(Type type, Reader reader)
            throws JsonException {
        return parse(type, reader);
    }

    private static Object parse(Type type, Reader reader) {
        Object obj = fromJson(reader);
        if (type != null)
            return Mapl.maplistToObj(obj, type);
        return obj;
    }

    /**
     * 根据指定的类型,从字符串中生成 JAVA 对象。 指定的类型可以是任意 JAVA 对象。
     *
     * @param type
     *            对象类型,可以是范型
     * @param cs
     *            JSON 字符串
     * @return 指定类型的 JAVA 对象
     * @throws JsonException
     */
    public static Object fromJson(Type type, CharSequence cs)
            throws JsonException {
        return fromJson(type, Lang.inr(cs));
    }

    /**
     * 根据指定的类型,读取指定的 JSON 文件生成 JAVA 对象。 指定的类型可以是任意 JAVA 对象。
     *
     * @param type
     *            对象类型
     * @param f
     *            文件对象
     * @return 指定类型的 JAVA 对象
     * @throws JsonException
     */
    public static <T> T fromJsonFile(Class<T> type, File f) {
        BufferedReader br = null;
        try {
            br = buffr(fileInr(f));
            return Json.fromJson(type, br);
        }
        finally {
            Streams.safeClose(br);
        }
    }

    /**
     * 从 JSON 字符串中,获取 JAVA 对象。 实际上,它就是用一个 Read 包裹了的字符串。
     * <p>
     * 请参看函数 ‘Object fromJson(Reader reader)’ 的描述
     *
     * @param cs
     *            JSON 字符串
     * @return JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Reader reader)
     */
    public static Object fromJson(CharSequence cs) throws JsonException {
        return fromJson(Lang.inr(cs));
    }

    /**
     * 根据指定的类型,从字符串中生成 JAVA 对象。 指定的类型可以是任意 JAVA 对象。
     * <p>
     * 请参看函数 ‘<T> T fromJson(Class<T> type, Reader reader)’ 的描述
     *
     * @param type
     *            对象类型
     * @param cs
     *            JSON 字符串
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Class type, Reader reader)
     */
    public static <T> T fromJson(Class<T> type, CharSequence cs)
            throws JsonException {
        return fromJson(type, Lang.inr(cs));
    }

    // =========================================================================
    // ============================Json.toJson==================================
    // =========================================================================
    private static Class<? extends JsonRender> jsonRenderCls;

    public static Class<? extends JsonRender> getJsonRenderCls() {
        return jsonRenderCls;
    }

    public static void setJsonRenderCls(Class<? extends JsonRender> cls) {
        jsonRenderCls = cls;
    }

    /**
     * 将一个 JAVA 对象转换成 JSON 字符串
     *
     * @param obj
     *            JAVA 对象
     * @return JSON 字符串
     */
    public static String toJson(Object obj) {
        return toJson(obj, null);
    }

    /**
     * 将一个 JAVA 对象转换成 JSON 字符串,并且可以设定 JSON 字符串的格式化方式
     *
     * @param obj
     *            JAVA 对象
     * @param format
     *            JSON 字符串格式化方式 ,若 format 为 null ,则以 JsonFormat.nice() 格式输出
     * @return JSON 字符串
     */
    public static String toJson(Object obj, JsonFormat format) {
        StringBuilder sb = new StringBuilder();
        toJson(Lang.opw(sb), obj, format);
        return sb.toString();
    }

    /**
     * 将一个 JAVA 对象以 JSON 的形式写到一个文本输出流里
     *
     * @param writer
     *            文本输出流
     * @param obj
     *            JAVA 对象
     */
    public static void toJson(Writer writer, Object obj) {
        toJson(writer, obj, null);
    }

    /**
     * 将一个 JAVA 对象以 JSON 的形式写到一个文本输出流里,并且可以设定 JSON 字符串的格式化方式
     *
     * @param writer
     *            文本输出流
     * @param obj
     *            JAVA 对象
     * @param format
     *            JSON 字符串格式化方式 ,若 format 为 null ,则以 JsonFormat.nice() 格式输出
     */
    public static void toJson(Writer writer, Object obj, JsonFormat format) {
        try {
            if (format == null)
                format = JsonFormat.nice();

            Class<? extends JsonRender> jrCls = getJsonRenderCls();
            if (jrCls == null)
                jrCls = JsonRenderImpl.class;

            JsonRender jr = Mirror.me(jrCls).born();
            jr.setWriter(writer);
            jr.setFormat(format);
            jr.render(obj);

            writer.flush();
        }
        catch (IOException e) {
            throw Lang.wrapThrow(e, JsonException.class);
        }
    }

    /**
     * 将一个 JAVA 对象以 JSON 的形式写到一个文件里
     *
     * @param f
     *            文本文件
     * @param obj
     *            JAVA 对象
     */
    public static void toJsonFile(File f, Object obj) {
        toJsonFile(f, obj, null);
    }

    /**
     * 将一个 JAVA 对象以 JSON 的形式写到一个文件里,并且可以设定 JSON 字符串的格式化方式
     *
     * @param f
     *            文本文件
     * @param obj
     *            JAVA 对象
     * @param format
     *            JSON 字符串格式化方式 ,若 format 为 null ,则以 JsonFormat.nice() 格式输出
     */
    public static void toJsonFile(File f, Object obj, JsonFormat format) {
        Writer writer = null;
        try {
            Files.createFileIfNoExists(f);
            writer = Streams.fileOutw(f);
            Json.toJson(writer, obj, format);
            writer.append('\n');
        }
        catch (IOException e) {
            throw Lang.wrapThrow(e);
        }
        finally {
            Streams.safeClose(writer);
        }
    }

    /**
     * 清除 Json 解析器对实体解析的缓存
     */
    public static void clearEntityCache() {
        entities.clear();
    }

    /**
     * 保存所有的 Json 实体
     */
    private static final ConcurrentHashMap<String, JsonEntity> entities = new ConcurrentHashMap<String, JsonEntity>();

    /**
     * 获取一个 Json 实体
     */
    public static JsonEntity getEntity(Mirror<?> mirror) {
        JsonEntity je = entities.get(mirror.getTypeId());
        if (null == je) {
            je = new JsonEntity(mirror);
            entities.put(mirror.getTypeId(), je);
        }
        return je;
    }

    // ==================================================================================
    // ====================帮助函数======================================================

    /**
     * 从 JSON 字符串中,根据获取某种指定类型的 List 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, CharSequence cs)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param cs
     *            JSON 字符串
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Type type, CharSequence cs)
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> fromJsonAsList(Class<T> eleType, CharSequence cs) {
        return (List<T>) fromJson(NutType.list(eleType), cs);
    }

    /**
     * 从 JSON 输入流中,根据获取某种指定类型的 List 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, Reader reader)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param reader
     *            JSON 输入流
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Type type, Reader reader)
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> fromJsonAsList(Class<T> eleType, Reader reader) {
        return (List<T>) fromJson(NutType.list(eleType), reader);
    }

    /**
     * 从 JSON 字符串中,根据获取某种指定类型的 数组 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, CharSequence cs)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param cs
     *            JSON 字符串
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Type type, CharSequence cs)
     */
    @SuppressWarnings("unchecked")
    public static <T> T[] fromJsonAsArray(Class<T> eleType, CharSequence cs) {
        return (T[]) fromJson(NutType.array(eleType), cs);
    }

    /**
     * 从 JSON 输入流中,根据获取某种指定类型的 数组 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, Reader reader)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param reader
     *            JSON 输入流
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Class type, Reader reader)
     */
    @SuppressWarnings("unchecked")
    public static <T> T[] fromJsonAsArray(Class<T> eleType, Reader reader) {
        return (T[]) fromJson(NutType.array(eleType), reader);
    }

    /**
     * 从 JSON 字符串中,根据获取某种指定类型的 Map 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, CharSequence cs)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param cs
     *            JSON 字符串
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Type type, CharSequence cs)
     */
    @SuppressWarnings("unchecked")
    public static <T> Map<String, T> fromJsonAsMap(Class<T> eleType,
                                                   CharSequence cs) {
        return (Map<String, T>) fromJson(NutType.mapStr(eleType), cs);
    }

    /**
     * 从 JSON 输入流中,根据获取某种指定类型的 Map 对象。
     * <p>
     * 请参看函数 ‘Object fromJson(Type type, Reader reader)’ 的描述
     *
     * @param eleType
     *            对象类型
     * @param reader
     *            JSON 输入流
     * @return 特定类型的 JAVA 对象
     * @throws JsonException
     *
     * @see #fromJson(Type type, Reader reader)
     */
    @SuppressWarnings("unchecked")
    public static <T> Map<String, T> fromJsonAsMap(Class<T> eleType,
                                                   Reader reader) {
        return (Map<String, T>) fromJson(NutType.mapStr(eleType), reader);
    }

    // ==============================================================================
}
TOP

Related Classes of org.nutz.json.Json

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.