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);
}
// ==============================================================================
}