昨天谈到通过一个类的方法构建一个JSON字符串,后来发现昨天写的那个方法局限性很大,因为我只能传一个list对象过去,而且list集合里面的对象必须为实体类对象,因此使用昨天的那个方法很有可能会造成异常,程序的可扩展性也不是很强,所以今天上午花了一个上午的时间对昨天的程序进行了改进,可以说比昨天的代码有了明显的扩展,对任何对象都适用吧,当然本人也没有进行大量的测试,如果出现bug还希望网友们能提出来,本人好进行改进,谢谢!
代码如下:
package com.csu.util;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CreateJSON {
public String createObjToJson(Object obj,String JsonName) {
StringBuffer strBuff = new StringBuffer();
//判断items是不是Map类
if(obj instanceof Map<?,?>) {
Map myMap = (Map)obj;
strBuff.append(this.createMapToJson(myMap, JsonName));
}
//判断items对象是不是集合类
else if(obj instanceof Collection<?>) {
Collection<?> coList = (Collection<?>)obj;
//直接调用相关方法
strBuff.append(this.createByReflect(coList, JsonName));
}
//判断items对象是不是数组。
else if(obj.getClass().isArray()) {
strBuff.append(this.createArrayToJson(obj, JsonName));
}
//否则为普通对象
else {
strBuff.append(this.createNomalObjToJson(obj, JsonName));
}
return strBuff.toString();
}
//如果一个对象不是集合类对象,也不是Map类,也不是数组类型
public String createNomalObjToJson(Object obj,String JsonName) {
StringBuffer strBuff = new StringBuffer();
strBuff.append("{");
// 得到该对象的类
Class<?> vo = obj.getClass();
//判断该对象是否为八个数据类型 如果是基本数据类型则直接输出{JsonName:"vo"}
if(vo.isPrimitive() || vo == String.class
|| vo == Integer.class || vo == Float.class
|| vo == Double.class || vo == Long.class
|| vo == Byte.class || vo == Short.class
|| vo == Boolean.class
|| vo == Character.class) {
return "{\"" + JsonName + "\":\"" + vo + "\"}";
}
// 得到该对象的所有的字段
Field[] fields = vo.getDeclaredFields();
String methodName = null;
String fieldName = null;
for (int i = 0; i < fields.length; i++) {
// 得到字段名
fieldName = fields[i].getName();
// 得到该字段的数据类型
Class<?> fieldType = fields[i].getType();
// 得到该字段的get方法的方法名
methodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Method method = null;
Object fieldValue = null;
try {
method = vo.getMethod(methodName, new Class[] {});
fieldValue = method.invoke(obj);
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 将字段名加到字符串中去
strBuff.append("\"");
strBuff.append(fieldName);
strBuff.append("\":");
// 判断该字段的数据类型是不是Object类型,是对象类型的话,还得创建该对象的数据,即递归调用本方法
if (!fieldType.isPrimitive() && fieldType != String.class
&& fieldType != Integer.class && fieldType != Float.class
&& fieldType != Double.class && fieldType != Long.class
&& fieldType != Byte.class && fieldType != Short.class
&& fieldType != Boolean.class
&& fieldType != Character.class) {
if(fieldValue == null) {
strBuff.append("{}");
}else {
strBuff.append(this.createObjToJson(fieldValue,fieldName)); }
}
else {
strBuff.append("\"");
strBuff.append(fieldValue.toString());
strBuff.append("\"");
}
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("}");
return strBuff.toString();
}
//创建一个Map对象的JSON字符串
public String createMapToJson(Map obj,String JsonName) {
StringBuffer strBuff = new StringBuffer();
// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}
if (obj.size() == 0)
return "{\"" + JsonName + "\":[]}";
// 否则开始构建字符串
strBuff.append("{\"" + JsonName + "\":[");
Set<Map.Entry> mapEntry = obj.entrySet();
for(Iterator<Map.Entry> it = mapEntry.iterator();it.hasNext();){
Map.Entry item = it.next();
Object key = item.getKey();
String keyName = "{\"" + key.toString() + "\":";
Object value = item.getValue();
strBuff.append(keyName);
strBuff.append(this.createObjToJson(value, JsonName));
strBuff.append("},");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("]}");
return strBuff.toString();
}
//创建一个数组对象的JSON字符串
public String createArrayToJson(Object obj,String JsonName) {
StringBuffer strBuff = new StringBuffer();
// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}
if (Array.getLength(obj) == 0)
return "{\"" + JsonName + "\":[]}";
// 否则开始构建字符串
strBuff.append("{\"" + JsonName + "\":[");
for(int i = 0; i < Array.getLength(obj); i++) {
Object item = Array.get(obj, i);
strBuff.append(this.createObjToJson(item, JsonName));
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("]}");
return strBuff.toString();
}
//创建一个集合类对象的JSON字符串
public String createByReflect(Collection<?> obj, String JsonName) {
StringBuffer strBuff = new StringBuffer();
// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}
if (obj.size() == 0)
return "{\"" + JsonName + "\":[]}";
// 否则开始构建字符串
strBuff.append("{\"" + JsonName + "\":[");
for (Iterator<?> it = obj.iterator(); it.hasNext(); ) {
Object item = it.next();
strBuff.append(this.createObjToJson(item, JsonName));
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("]}");
return strBuff.toString();
}
}
分享到:
相关推荐
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以其简洁明了的文本形式,易于人阅读和编写,同时也易于机器解析和生成。在Java开发中,JSON常用于客户端与服务器之间的数据交互,例如API接口的...
需要注意的是,在当前版本中并没有包含针对JSON数组处理的模块,未来版本可能会根据用户的需求对此进行补充。现有的模块已经足够支持大多数情况下对JSON数据的操作需求。 #### 六、总结 通过Mixly提供的JSON数据...
4. **json-lib-2.2.3-jdk15.jar**:这可能是JSON库的另一个版本,可能被用作net.sf.json库的补充或替代。JSON-lib是一个将JSON转换为各种Java类型以及反之的库,支持多种Java平台。 5. **ezmorph-1.0.6.jar**:...
3. `commons-lang-2.5.jar`:Apache Commons Lang是一个提供了一系列实用的工具类的库,主要用于补充Java核心类库的功能。在处理JSON时,可能用到了Lang库提供的字符串操作、异常处理等功能。 4. `commons-...
JSONiq是一种专门针对JSON数据格式的查询语言,其设计理念基于XML的XQuery查询语言。...随着互联网数据交换格式的不断演变,JSONiq作为一种技术补充,为开发者提供了在XQuery环境中处理JSON数据的能力。
3. **commons-lang-2.3.jar**:Apache Commons Lang是Java标准类库的补充,包含了一些实用的工具类,可能在数据转换过程中提供辅助功能。 4. **commons-beanutils-1.7.0.jar**:Apache Commons BeanUtils简化了...
本文将深入探讨Jackson作为JSON转换工具的关键知识点,并基于提供的博文链接进行补充。 1. **Jackson库介绍** Jackson是一个开源项目,其核心库为`com.fasterxml.jackson.core`,包括`jackson-databind`、`jackson...
2. `commons-lang-2.5.jar`:Apache Commons Lang是一个实用工具类库,包含对Java语言功能的补充,如字符串操作、数组处理等。在解析或生成JSON字符串时,可能会用到这些工具。 3. `commons-beanutils-1.8.0.jar`:...
- **commons-lang-2.3.jar**: Apache Commons Lang提供了一系列实用的工具方法,补充了Java语言功能,如字符串操作、日期时间处理等,对于处理JSON字符串很有帮助。 - **commons-beanutils-1.7.0.jar**: Apache ...
3. **commons-lang-2.4.jar**:Apache Commons Lang是Apache软件基金会提供的一个Java工具包,包含一系列实用的工具类,用于补充Java语言功能。在处理JSON时,可能会用到字符串处理、日期时间操作等,这些功能在这个...
2. `commons-lang-2.5.jar`:Apache Commons Lang,是一个实用工具类库,补充了Java语言的基本功能,如字符串操作、日期时间处理等,对于`json-lib`在处理JSON字符串时可能需要用到这些功能。 3. `commons-...
总的来说,NPPJSONViewer是Notepad++的一个强大补充,特别是对于那些在工作中频繁接触JSON数据的开发者来说,它简化了JSON的查看和编辑过程,让代码管理和调试变得更加便捷。通过简单的安装步骤,用户就能享受到这款...
JSON-B(Java Binding for JSON)是JSON-P的补充,提供了自动绑定机制,类似于JAXB对于XML的处理。`jakarta.json.bind-api-*.jar`和`jakarta.json-api-*.jar`分别是其API和实现。 6. **Apache Commons JSON** ...
全国各城市的经纬度的json数据,欢迎大家下载调用,有补充的请私信我
2. 可能的第二个脚本(未明确指出文件名):这个脚本可能是对json2.js的补充或者优化,针对特定问题或提供了额外的功能,比如性能优化、错误处理、自定义转换函数等。具体功能需要查看实际的文件内容才能得知。 ...
在压缩包的子文件名中,“asp的另一个json类,数组形式,给jquery用的.txt”表明还提供了另一个ASP JSON类的文档或说明,可能是对原类库的补充,或者是另一种实现方式,同样适用于处理JSON数组,供jQuery使用。...
package.json的模板,里面包含了笔者已经验证过的内容,已经给出相关注释,后续会不读那补充,也希望有精通的朋友们帮忙提供建议
【beetl-json】是一个专为Java开发人员设计的库...总之,beetl-json是Beetl框架的一个强大补充,使得在Java应用中处理JSON数据变得更加简单和高效。通过深入了解和实践,你可以充分利用其特性,提升你的后端开发效率。
总之,`jquery.jsoncookie`是jQuery库的一个强大补充,它使得在Cookie中处理JSON数据变得简单。通过使用这个插件,开发者可以更方便地在客户端存储和恢复结构化的应用程序状态,提高Web应用的用户体验。
同时,如果`G2`确实指的是数据可视化库,那么它可能被用作ECharts的补充,或者在不同的场景下替代ECharts,例如在移动设备或特定的图表需求中。 总的来说,这个压缩包为在Web应用中展示江苏省地图提供了必要的数据...