`
pleasetojava
  • 浏览: 730272 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

JSON Java端JavaBean/Collection与JSON对象的转换

阅读更多

JSONAJAX编程中浏览器与WEB服务器之间一种轻型的基于文本的信息交换协议,其目的是作为XML信息格式的一种替代。它优于XML在于:
1. JSON
在浏览器端是JAVASCRIPT对象的一种字面表达;
2.JSON
是有类型的,而XML是无类型的。
JSON
提供了JAVASCRIPTJAVA工具方法和类型。但JAVA端类型太底层,只提供JSONObjectJSONArray等初级类型,没 有提供这些类型和JavaBean/Collection的直接转化。以下程序提供了这些类型之间的相互转换。对Map类型没有提供完整的转换,望读者根 据已存在的工具方法自己实现。

public static Object json2Bean(JSONObject json, Class beanClass, Map<String, Class> collectionComponentTypes) throws Exception:
完成JSONObjectJavaBean的转换,第三个参数说明的是JavaBean类型中有容器类型时,容器类型的属性名及其容器所含元素的类型。

public static JSONObject bean2Json(Object bean)
:完成JavaBeanJSONObject的转换。

public static JSONArray collectionToJson(Object value)/public static JSONArray arrayToJarr(Object value) :
完成Collection/ArrayJSONArray的转换。







package com.kettas.ajax.day3.json;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

import org.json.JSONArray;
import org.json.JSONObject;

public class JsonUtil {
private static Class[] classes = {
byte.class, short.class, int.class,long.class,
float.class, double.class, boolean.class, char.class,
Byte.class, Short.class, Integer.class, Long.class,
Float.class, Double.class, Boolean.class, Character.class,
String.class
};

private static Class[] arrayClasses = {
byte[].class, short[].class, int[].class,long[].class,
float[].class, double[].class, boolean[].class, char[].class,
Byte[].class, Short[].class, Integer[].class, Long[].class,
Float[].class, Double[].class, Boolean[].class, Character[].class,
String[].class
};

public static Object json2Bean(JSONObject json, Class beanClass, Map<String, Class> collectionComponentTypes) throws Exception{
Object bean = null;
bean = beanClass.newInstance();

Method[] setters = getSetters(beanClass);
for(int i = 0; i < setters.length; i++){
Method setter = setters[i];
String property = getProperty(setter.getName());
if(property == null || json.get(property) == null) continue;
Class paramType = setter.getParameterTypes()[0];
if(isPrimitive(paramType)){
setter.invoke(bean, json.get(property));
} else if(isPrimitiveArray(paramType)){
JSONArray jarr = json.getJSONArray(property);
Object arr = Array.newInstance(getType(paramType), jarr.length());
for(int j = 0; j < jarr.length(); j++)
Array.set(arr, j, jarr.get(j));
setter.invoke(bean, arr);
}else if(paramType == java.util.Date.class){
setter.invoke(bean, new java.util.Date((long)json.getDouble(property)));
}else if(paramType == java.sql.Date.class){
setter.invoke(bean, new java.sql.Date((long)json.getDouble(property)));
}else if(paramType == java.sql.Time.class){
setter.invoke(bean, new java.sql.Time((long)json.getDouble(property)));
}else if(paramType == java.sql.Timestamp.class){
setter.invoke(bean, new java.sql.Timestamp((long)json.getDouble(property)));
}else if(paramType == java.util.Calendar.class){
java.util.Calendar c = java.util.Calendar.getInstance();
c.setTimeInMillis((long)json.getDouble(property));
setter.invoke(bean, c);
}else if(paramType == java.util.Set.class){
Class componentType = null;
if(collectionComponentTypes != null)
componentType = collectionComponentTypes.get(property);
java.util.Set s = new java.util.HashSet();
initCollection(s, json.getJSONArray(property), componentType, collectionComponentTypes);
setter.invoke(bean, s);
}else if(paramType == java.util.List.class ||
paramType == java.util.Collection.class){
Class componentType = null;
if(collectionComponentTypes != null)
componentType = collectionComponentTypes.get(property);
java.util.List l = new java.util.ArrayList();
initCollection(l, json.getJSONArray(property), componentType, collectionComponentTypes);
setter.invoke(bean, l);
}else if(paramType.getName().startsWith("[")){
Object[] arr = toObjectArray(paramType, json.getJSONArray(property), collectionComponentTypes);
setter.invoke(bean, arr);
}else{
setter.invoke(bean, json2Bean(json.getJSONObject(property), paramType, collectionComponentTypes));
}
}

return bean;
}

private static Class<?> getType(Class paramType) {
Class type = null;
for(int i = 0; i < arrayClasses.length; i++){
if(paramType == arrayClasses[i]){
type = classes[i];
}
}
return type;
}

public static Object[] toObjectArray(Class paramType, JSONArray jarr, Map<String, Class> collectionComponentTypes) throws Exception{
Object[] objs = new Object[jarr.length()];
Class beanClass = Class.forName(paramType.getName().substring(2));
for(int i = 0; i < objs.length; i++){
objs[i] = json2Bean(jarr.getJSONObject(i), beanClass, collectionComponentTypes);
}
return objs;
}

public static void initCollection(Collection c, JSONArray jarr, Class componentType, Map<String, Class> collectionComponentTypes) throws Exception{
//component of collection is primitive
if(componentType == null || isPrimitive(componentType)){
for(int i = 0; i < jarr.length(); i++ )
c.add(jarr.get(i));
}else if(componentType == java.util.Date.class){
for(int i = 0; i < jarr.length(); i++)
c.add(new java.util.Date((long)jarr.getDouble(i)));
}else if(componentType == java.sql.Date.class){
for(int i = 0; i < jarr.length(); i++)
c.add(new java.sql.Date((long)jarr.getDouble(i)));
}else if(componentType == java.sql.Time.class){
for(int i = 0; i < jarr.length(); i++)
c.add(new java.sql.Time((long)jarr.getDouble(i)));
}else if(componentType == java.sql.Timestamp.class){
for(int i = 0; i < jarr.length(); i++)
c.add(new java.sql.Timestamp((long)jarr.getDouble(i)));
}else if(componentType == java.util.Calendar.class){
for(int i = 0; i < jarr.length(); i++){
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTimeInMillis((long)jarr.getDouble(i));
c.add(cal);
}
}else if(componentType != null){
for(int i = 0; i < jarr.length(); i++){
c.add(json2Bean(jarr.getJSONObject(i), componentType, collectionComponentTypes));
}
}
}

public static JSONObject bean2Json(Object bean){
Class clazz = bean.getClass();
JSONObject json = new JSONObject();
Method[] getters = getGetters(clazz);
int len = getters.length;
for(int i = 0; i < len; i++){
Method m = getters[i];
String property = getProperty(m.getName());
Class retType = m.getReturnType();
if(property == null || property.equals("class") )continue;
try {
Object value = m.invoke(bean, null);
if(isPrimitive(retType))
json.put(property, value);
else if(isPrimitiveArray(retType)){
JSONArray jarr = priArray(value);
json.put(property, jarr);
}else if(isDate(value)){
json.put(property, getTime(value));
}else if(value instanceof Collection){
json.put(property, collectionToJson(value));
}else if(retType.getName().startsWith("[")){
json.put(property, arrayToJarr(value));
}else if(value instanceof Map){
json.put(property, new JSONObject((Map)value));
}
else{
json.put(property, bean2Json(value));
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error to get value");
}
}

return json;
}

public static JSONArray arrayToJarr(Object value) {
// TODO Auto-generated method stub
Object[] arr = (Object[])value;
Collection c = new ArrayList();
for(Object o : arr)
c.add(o);
return collectionToJson(c);
}

public static JSONArray collectionToJson(Object value) {
// TODO Auto-generated method stub
JSONArray jarr = new JSONArray();
Collection c = (Collection)value;
for(Object o : c){
Class type = o.getClass();
if(isPrimitive(type)) jarr.put(o);
else if(isPrimitiveArray(type)) jarr.put(priArray(o));
else if(isDate(o)) jarr.put(getTime(o));
else if(o instanceof Collection) jarr.put(collectionToJson(o));
else if(type.getName().startsWith("[")) jarr.put(arrayToJarr(o));
else if(o instanceof Map) jarr.put(new JSONObject((Map)o));
else jarr.put(bean2Json(o));
}

return jarr;
}

private static Object getTime(Object value) {
// TODO Auto-generated method stub
if(value instanceof Date)
return ((Date)value).getTime() ;
return ((Calendar)value).getTimeInMillis();
}

private static boolean isDate(Object value){
return value instanceof Date ||
value instanceof Calendar;
}

public static JSONArray priArray(Object value){
JSONArray jarr = new JSONArray();
int arLen = Array.getLength(value);
for(int j = 0; j < arLen; j++){
jarr.put(Array.get(value, j));
}

return jarr;
}

private static String getProperty(String name) {
// TODO Auto-generated method stub
if(name.startsWith("get") || name.startsWith("set")) name = name.substring(3);
else name = name.substring(2);
if(name.length() > 0){
StringBuilder sb = new StringBuilder(name.length());
char first = name.charAt(0);
if(name.length() > 1){
char second = name.charAt(1);
if(second >='A' && second <='Z');
else first += 32;
}
sb.append(first).append(name.substring(1));
return sb.toString();
}

return null;
}

private static Method[] getGetters(Class clazz){
Method[] methods = clazz.getMethods();
ArrayList<Method> getters = new ArrayList<Method>();
for(int i = 0; i < methods.length; i++){
if(methods[i].getName().startsWith("get") ||
methods[i].getName().startsWith("is") ){
Class[] paramTypes = methods[i].getParameterTypes();
if(paramTypes == null || paramTypes.length == 0 )
getters.add(methods[i]);
}
}

Method[] retMethods = new Method[getters.size()];
int i = 0;
for(Method m : getters){
retMethods[i++] = m;
}

return retMethods;
}

private static Method[] getSetters(Class clazz){
Method[] methods = clazz.getMethods();
ArrayList<Method> setters = new ArrayList<Method>();
for(int i = 0; i < methods.length; i++){
if(methods[i].getName().startsWith("set")){
if(methods[i].getParameterTypes() != null &&
methods[i].getParameterTypes().length == 1) setters.add(methods[i]);
}
}

Method[] retMethods = new Method[setters.size()];
int i = 0;
for(Method m : setters){
retMethods[i++] = m;
}

return retMethods;
}

private static boolean isPrimitive(Class clazz){
for(int i = 0; i < classes.length; i++){
if(classes[i] == clazz) return true;
}

return false;
}

private static boolean isPrimitiveArray(Class clazz){
for(int i = 0; i < arrayClasses.length; i++){
if(arrayClasses[i] == clazz) return true;
}

return false;
}

private static boolean isSpecificClass(Class clazz){
return isPrimitive(clazz) || isPrimitiveArray(clazz);
}
}

分享到:
评论

相关推荐

    json-lib包(Java解析JSON的所有依赖包)

    这个库支持多种Java类型与JSON对象之间的转换,包括JavaBean、Map、Collection、数组等。`json-lib`还提供了XML、HTML表单以及JDOM、DOM4J等多种格式与JSON之间的转换功能。 ### JSON对象的主要结构 JSON主要由两种...

    java创建 解析json lib包

    它提供了简单的API,支持Java对象与JSON之间的直接映射。 导入这些库后,开发者可以通过API来创建JSON对象、解析JSON字符串、遍历JSON结构、修改JSON内容等。例如,使用Jackson库,你可以这样做: ```java import ...

    java解析json的jar包

    1. **json-lib**:这是一个多功能的JSON库,支持多种Java对象到JSON的转换,如JavaBean、Map、Collection、数组等。它还提供了反向转换,即从JSON字符串解析出Java对象。json-lib的优势在于其广泛的兼容性,可以与...

    json转对象需要的jar包

    6. **json-lib-2.4-jdk15.jar**:JSON-Lib是一个Java库,提供了一种将JSON与多种Java数据类型之间转换的API,包括JavaBeans、Collection、Map、XML等。它是JSON处理的核心库,能够将JSON字符串解析为Java对象,也...

    java解析JSON所需的全部jar包

    Json-lib支持多种Java数据类型与JSON之间的转换,包括Java Bean、Collection(List、Set)、Map、Array等。它还支持将XML转换为JSON,并且可以将JSON反序列化为Java对象。 2. **commons-collections-3.2.1.jar**:...

    Java Web程序实现返回JSON字符串的方法总结

    需要注意的是,在使用 JSONArray 对象时,我们需要将 JavaBean 对象转换为 Map 对象,否则无法正确地将其转换为 JSON 字符串。 为了解决 Java 对象属性为空时返回空字符串的问题,我们可以使用 JSONObject 对象的 ...

    JS和JAVA使用JSON方法解析汇报.docx

    2. **Java与JSON类型对应关系** Java对象可以转换为JSON,反之亦然。以下是一些基本类型的对应关系: - Java Bean -&gt; JSON Object - Java Collection/Array -&gt; JSON Array - Java Map -&gt; JSON Object - Java ...

    fastjson-1.2.41.jar 非常好用的JSON转换依赖包

    1.FastJson的介绍: JSON协议使用方便,越来越流行,...1.JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换 2.JSONObject:fastJson提供的json对象 3.JSONArray:fastJson提供json数组对象

    JSON-lib

    JSON-lib提供了多种Java API,使得开发者能够方便地在Java对象和JSON格式之间进行转换。 在Java中,将JSON字符串解析成对象是常见的需求。JSON-lib通过以下几种方式实现了这一功能: 1. **JavaBeans到JSON**:你...

    json包

    在JSON与Java对象相互转换时,BeanUtils可以协助完成JavaBean到JSON的映射。 5. `ezmorph-1.0.3.jar`:EZMorph库提供了动态对象转换功能,使得将一种数据类型转换为另一种数据类型变得简单。在处理JSON时,可能会...

    Json全部jar包

    总结来说,`Json全部jar包`是Java开发中处理JSON数据的一组工具,其中的`json-lib-2.2.2-jdk15.jar`是其中一个关键的库,它提供了将Java对象与JSON格式之间转换的功能。了解并掌握如何使用这些库对于任何涉及JSON...

    json工具包和js

    FastJSON是阿里巴巴开发的JSON解析库,它的性能非常高,支持JavaBean、Map、Collection等类型的JSON转换。FastJSON的使用非常直观,如`JSON.parseObject()`和`JSON.toJSONString()`分别用于JSON字符串到Java对象的...

    json-lib-2.2.3-jdk15.jar 相关jar包

    json-lib库支持多种Java对象到JSON的映射,包括JavaBean、Map、Collection、Array等,并且可以反向将JSON转换回相应的Java对象。 该jar包的依赖项包括: 1. "ezmorph-1.0.3.jar":Ezmorph库是一个Java库,用于在...

    java_android_javaBean json转换工具类的标准代码

    一些工具类代码块的标准代码,包括但不限于: javaBean、列表数组转换为json字符串 ...与javaBean json数组字符串转换为列表 获取泛型的Collection Type map 转JavaBean map 转json map 转JavaBean

    最新json-lib及其依赖库包.rar

    此外,它还支持JavaBean、Map、Collection、数组、XML以及自定义对象与JSON之间的转换,方便开发者进行数据交互。 2. **JavaBeans**:JavaBeans是Java编程语言中的一个组件模型,它定义了一种特定的类结构,使得...

    json需要的jar包

    在本例中,`json-lib-2.4-jdk15` 版本是针对JDK1.5编译的,它支持多种数据类型,包括JavaBean、Map、Collection、Array等,使得在Java中处理JSON数据变得非常直观。 要使用这些库,首先需要将jar包添加到项目的类...

    json-lib 所需jar包

    `json-lib`支持多种类型的Java对象,包括JavaBean、Map、Collection、数组等,并且它还提供了一些扩展,例如支持自定义的序列化和反序列化策略。这个库在处理复杂的JSON结构时非常方便,尤其当你的应用程序需要频繁...

    json-lib.jar及其所有依赖包

    这样,你就可以利用json-lib提供的API,方便地进行JSON与Java对象之间的转换。例如,你可以使用`net.sf.json.JSONObject`和`net.sf.json.JSONArray`类来创建和操作JSON对象,而`JSONObject.fromObject()`和`...

    json-lib-2.4&dependencies jars.zip

    这些依赖的jar包与`json-lib-2.4.jar`一起使用,可以确保在Java开发环境中顺利地进行JSON相关的操作,例如序列化和反序列化JSON,创建JSON对象,解析JSON字符串,以及处理复杂的JSON数据结构等。 在实际开发中,...

    解析json 需要的jar

    在将JSON数据转换为Java对象时,beanutils可以自动将JSON键映射到JavaBean的属性,大大简化了数据绑定的过程。 在Java Web开发中,这些库经常被用在服务器端,接收和响应客户端(如Android应用)通过HTTP发送的JSON...

Global site tag (gtag.js) - Google Analytics