All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nutz.json.Json Maven / Gradle / Ivy

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 fromJson(Class 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 fromJsonFile(Class type, File f) {
        BufferedReader br = null;
        try {
            br = buffr(fileInr(f));
            return Json.fromJson(type, br);
        }
        finally {
            Streams.safeClose(br);
        }
    }

    /**
     * 从 JSON 字符串中,获取 JAVA 对象。 实际上,它就是用一个 Read 包裹了的字符串。
     * 

* 请参看函数 ‘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 对象。 *

* 请参看函数 ‘ T fromJson(Class type, Reader reader)’ 的描述 * * @param type * 对象类型 * @param cs * JSON 字符串 * @return 特定类型的 JAVA 对象 * @throws JsonException * * @see #fromJson(Class type, Reader reader) */ public static T fromJson(Class type, CharSequence cs) throws JsonException { return fromJson(type, Lang.inr(cs)); } // ========================================================================= // ============================Json.toJson================================== // ========================================================================= private static Class jsonRenderCls; public static Class getJsonRenderCls() { return jsonRenderCls; } public static void setJsonRenderCls(Class 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 = deft.clone(); JsonRender jr; Class jrCls = getJsonRenderCls(); if (jrCls == null) jr = new JsonRenderImpl(); else 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 entities = new ConcurrentHashMap(); /** * 获取一个 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 对象。 *

* 请参看函数 ‘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 List fromJsonAsList(Class eleType, CharSequence cs) { return (List) fromJson(NutType.list(eleType), cs); } /** * 从 JSON 输入流中,根据获取某种指定类型的 List 对象。 *

* 请参看函数 ‘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 List fromJsonAsList(Class eleType, Reader reader) { return (List) fromJson(NutType.list(eleType), reader); } /** * 从 JSON 字符串中,根据获取某种指定类型的 数组 对象。 *

* 请参看函数 ‘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[] fromJsonAsArray(Class eleType, CharSequence cs) { return (T[]) fromJson(NutType.array(eleType), cs); } /** * 从 JSON 输入流中,根据获取某种指定类型的 数组 对象。 *

* 请参看函数 ‘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[] fromJsonAsArray(Class eleType, Reader reader) { return (T[]) fromJson(NutType.array(eleType), reader); } /** * 从 JSON 字符串中,根据获取某种指定类型的 Map 对象。 *

* 请参看函数 ‘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 Map fromJsonAsMap(Class eleType, CharSequence cs) { return (Map) fromJson(NutType.mapStr(eleType), cs); } /** * 从 JSON 输入流中,根据获取某种指定类型的 Map 对象。 *

* 请参看函数 ‘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 Map fromJsonAsMap(Class eleType, Reader reader) { return (Map) fromJson(NutType.mapStr(eleType), reader); } protected static JsonFormat deft = JsonFormat.nice(); public static void setDefaultJsonformat(JsonFormat defaultJf) { if (defaultJf == null) defaultJf = JsonFormat.nice(); Json.deft = defaultJf; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy