`

JSON 构造器类,可以将Java对象映射为JSON对象

阅读更多
写道
/**
* JSON 构造器类,可以将Java对象映射为JSON对象
* @author yyl
* @datetime
* @version
*/
public class JsonBuilder {

//排除的字段
private Set<String> excludeFields = new HashSet<String>();
private static final Object EMPTY_OBJECT_ARRAY[] = new Object[;

public JsonBuilder() {
excludeFields.add("class");
excludeFields.add("declaringClass");
excludeFields.add("metaClass");
}

/**
* 转换成JSON时需要排除的字段
* @param excludes
*/
public void setExcludeFields(String... excludes) {
for (String exclude : excludes) {
excludeFields.add(exclude);
}
}

/**
* 将Java对象转化为JSON对象
* @param obj java对象
* @return js对象
*/
public String encode(Object object) {
return encodeBasic(object);
}

/**
* 将Java对象转化为JSON对象
* @param obj java对象
* @return js对象
*/
private String encodeBasic(Object object) {
// basic
if (object == null) {
return encodeNULL();
} else if (object instanceof String) {
return encodeString((String) object);
} else if (object instanceof Boolean) {
return encodeBoolean((Boolean) object);
} else if (object instanceof Number) {
return encodeNumber((Number) object);
} else if (object instanceof Map) {
return encodeMap((Map) object);
} else if (object instanceof Iterable) {
return encodeIterable((Iterable) object);
} else if (object instanceof Object[]) {// object.getClass().isArray()
return encodeArray((Object[]) object);
} else if (object instanceof java.util.Date) {
return encodeDate((java.util.Date) object);
} else {
Class clazz = object.getClass();

if (clazz.isInterface()) {
return encodeEmpty();
}

if (clazz.isEnum()) {
return encodeEnum((java.lang.Enum) object);
} else {
return encodeAdapter(object);
}
}
}

/**
* 返回一个NULL对象
* @return javascript null对象
*/
private String encodeNULL() {
return "null";
}

/**
* 将Java-String对象转化为JSON对象
* @param string 字符串对象
* @return javascript string对象
*/
private String encodeString(String string) {
StringBuilder sbr = new StringBuilder(string.length() * ;
sbr.append("'");
for (int i = sz = string.length(); i < sz; i++) {
char ch = string.charAt(i);
// handle unicode
if (ch > fff) {
sbr.append("\\u");
sbr.append(hex(ch));
} else if (ch > ff) {
sbr.append("\\u);
sbr.append(hex(ch));
} else if (ch > ) {
sbr.append("\\u);
sbr.append(hex(ch));
} else if (ch < {
switch (ch) {
case '\b':
sbr.append('\\');
sbr.append('b');
break;
case '\n':
sbr.append('\\');
sbr.append('n');
break;
case '\t':
sbr.append('\\');
sbr.append('t');
break;
case '\f':
sbr.append('\\');
sbr.append('f');
break;
case '\r':
sbr.append('\\');
sbr.append('r');
break;
default:
if (ch > f) {
sbr.append("\\u);
sbr.append(hex(ch));
} else {
sbr.append("\\u);
sbr.append(hex(ch));
}
break;
}
} else {
// line.
switch (ch) {
case '\'':
sbr.append('\\');
sbr.append('\'');
break;
case '"':
sbr.append('\\');
sbr.append('"');
break;
case '\\':
sbr.append('\\');
sbr.append('\\');
break;
default:
sbr.append(ch);
break;
}
}
}
sbr.append("'");
return sbr.toString();
}

private String hex(char ch) {
return Integer.toHexString(ch).toUpperCase(Locale.ENGLISH);
}

/**
* 将Java-Boolean对象转化为JSON对象
* @param obj 字符串对象
* @return javascript Boolean对象
*/
private String encodeBoolean(Boolean b) {
return b.toString();
}

/**
* 将Java-Number对象转化为JSON对象
* @param n 数字对象
* @return javascript Number对象
*/
private String encodeNumber(Number n) {
return n.toString();
}

/**
* 将Java-Map对象转化为JSON对象
*
* @param map Map对象
* @return javascript Map对象(简单对象)
*/
private String encodeMap(Map map) {
StringBuilder sbr = new StringBuilder();
sbr.append("{");
boolean isFirst = true;
for (java.util.Iterator it = map.entrySet().iterator(); it.hasNext();) {
if (isFirst) {
isFirst = false;
} else {
sbr.append(",");
}
Map.Entry entry = (Map.Entry) it.next();
sbr.append(encodeBasic(entry.getKey())).append(":").append(encodeBasic(entry.getValue()));
}
sbr.append("}");
return sbr.toString();
}

/**
* 将Java-Iterable对象转化为JSON对象
* @param iterable Iterable对象
* @return javascript Array对象
*/
private String encodeIterable(java.lang.Iterable iterable) {
StringBuilder sbr = new StringBuilder();
sbr.append("[");
int index =
for (java.util.Iterator it = iterable.iterator(); it.hasNext();) {
if ((index++) > {
sbr.append(",");
}
sbr.append(encodeBasic(it.next()));
}
sbr.append("]");
return sbr.toString();
}

/**
* 将Java-数组对象转化为JSON对象
* @param obj 数组对象
* @return javascript Array对象
*/
private String encodeArray(Object[] array) {
StringBuilder sbr = new StringBuilder();
sbr.append("[");
for (int index = index < array.length; index++) {
if (index > {
sbr.append(",");
}
Object o = array[index];
sbr.append(encodeBasic(o));
}
sbr.append("]");
return sbr.toString();
}

/**
* 将Java-Date对象转化为JSON对象
* @param date 日期对象
* @return javascript Date对象
*/
private String encodeDate(java.util.Date date) {
return new StringBuilder().append("new Date(").append(date.getTime()).append(")").toString();
}

/**
* 将Java-Enum对象转化为JSON对象
* @param e 枚举对象
* @return javascript Date对象
*/
private String encodeEnum(java.lang.Enum e) {
return "'" + e.name() + "'";
}

/**
* 返回一个JSON简单对象
* @return javascript 简单对象
*/
private String encodeEmpty() {
return "{}";
}

/**
* 将Java对象转化为JSON对象
* @param object Java对象
* @return 如果适配器能解析,则返回解析后的JSON对象,否则返回一个默认Empty JSON对象
*/
private String encodeAdapter(Object object) {
try {
Map<String, Object> proxy = new HashMap<String, Object>();
Class clazz = object.getClass();
if (clazz == null) {
throw new IllegalArgumentException("No bean class specified");
}
proxy.put("class", clazz.getName());
PropertyDescriptor[] descriptors = null;
try {
descriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
} catch (IntrospectionException e) {
descriptors = new PropertyDescriptor[;
}
for (int i = j = descriptors.length; i < j; i++) {
PropertyDescriptor descriptor = descriptors[i];
String key = descriptor.getName();
//排除的字段
if (excludeFields.contains(key)) {
continue;
}
Method method = descriptor.getReadMethod();
if (descriptor.getReadMethod() != null) {
Class<?> type = descriptor.getPropertyType();

if (type.isEnum()) {
continue;
}
Object value = method.invoke(object, EMPTY_OBJECT_ARRAY);
proxy.put(key, value);
}
}
return encodeMap(proxy);
} catch (Exception ex) {
return encodeEmpty();
}
}
}

 

分享到:
评论

相关推荐

    react-json-schema:使用映射到React组件的JSON模式配置和构建视图

    react-json-schema npm install react-json-schema 通过将JSON定义映射到React组件来从JSON构造React元素。 将react-json-schema用于数据驱动的布局,或用作React组件和道具的抽象层。 渲染到任何地方(只要是DOM)...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    JSON解析实战升级篇:JSON数组中含JSON数组

    信仰和思想有三重身份,它是历史的子女、... 通过类的构造器,建立类间的映射关系,创建对象 问题描述 接收的JSON数据如下: [{ object: [{ content: 103, name: 编码, code: code }, { content: 经理层(部门),

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包101

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    serializr:在JSON和Javascript类之间对复杂的对象图进行序列化和反序列化

    Serializr是一个实用程序库,可帮助将json结构转换为复杂的对象图,反之亦然。 要快速浏览,请阅读 特征: (反)序列化使用构造函数/类创建的对象 (反)序列化原始值 (反)序列化嵌套的对象,映射和数组 异步...

    java开源包2

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包7

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java资源包01

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    nereides-jackson:用于Jackson的面向对象的JSON库包装器

    Nereid * for Jackson是用于面向对象的JSON库包装器,它允许开发人员以纯面向对象的方式使用JSON文档:一切都通过构造函数实例化,没有静态方法,没有null和没有“映射器”,或者“建造者”。 最重要的是,核心Json...

Global site tag (gtag.js) - Google Analytics