禾匠小程序下单表单6表单如何序列化

微信小程序
设置背景占满整个页面 - huozaimengli - 博客园
随笔 - 19, 文章 - 0, 评论 - 0, 引用 - 0
微信小程序,默认的根节点是&page&&/page&,所有内容都包裹在这个标签里,如何让页面的背景占满整个屏幕??
&view class="bg"&
.bg {background-image:url(...)}
有人说设置page {height:100%}& .bg{height:100%;},这种方法在页面的高度不超过屏幕有的高度时可以,但是一旦页面的高度超过屏幕高度时,超过的部分会没有效果,原因是因为page标签的高度默认就是手机屏幕的高度,不会被内容撑高;
如何解决?
.bg{min-height:100%;}这样设置即可;求助:一个表单中有多个input,数量不确定,怎么验证不为空,一次性提交后,怎么获取到值?
[问题点数:40分,结帖人xuhonggood1]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:1928
本版专家分:1928
本版专家分:40753
2018年2月 Web 开发大版内专家分月排行榜第三2017年10月 Web 开发大版内专家分月排行榜第三2017年4月 Web 开发大版内专家分月排行榜第三2013年11月 Web 开发大版内专家分月排行榜第三
本版专家分:118
本版专家分:0
本版专家分:1928
本版专家分:1928
匿名用户不能发表回复!|
其他相关推荐如何提交表单后仍然保留表单的数据
[问题点数:100分,结帖人ilearn]
本版专家分:0
结帖率 99.38%
CSDN今日推荐
本版专家分:14711
2012年4月 PHP大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
本版专家分:0
本版专家分:14711
2012年4月 PHP大版内专家分月排行榜第三
本版专家分:14711
2012年4月 PHP大版内专家分月排行榜第三
本版专家分:0
本版专家分:0
匿名用户不能发表回复!|
其他相关推荐只列出这四种数据的返回形式:
& (1)直接返回DataSet对象& (2)返回DataSet对象用Binary序列化后的字节数组& (3)返回DataSetSurrogate对象用Binary序列化后的 字节数组& (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组
DataSetSurrogate 类为微软在2.0的时候提供的压缩DataSet的类,下载
代码如下:
&[WebMethod(Description = "直接返回DataSet对象")]&&&&&&& public DataSet GetDataSet() &&&&&&& {&&&&&&&&&&& string connStr = System.Configuration.ConfigurationManager.AppSettings["ConnString"].ToString();&&&&&&&&&&& SqlConnection conn = new SqlConnection(connStr);&&&&&&&&&&& string sql = "select * from Base_Dic";&&&&&&&&&&& conn.Open();&&&&&&&&&&& SqlDataAdapter sda = new SqlDataAdapter(sql, conn);&&&&&&&&&&& DataSet ds = new DataSet("China");&&&&&&&&&&& sda.Fill(ds);&&&&&&&&&&& conn.Close();&&&&&&&&&&&&&&&&&& }
&&&&&&& [WebMethod(Description = "直接返回DataSet对象,并用Binary序列化后的字节数组")]&&&&&&& public byte[] GetDataSetBytes() &&&&&&& {&&&&&&&&&&& DataSet ds = GetDataSet();&&&&&&&&&&& BinaryFormatter ser = new BinaryFormatter();&&&&&&&&&&& MemoryStream ms = new MemoryStream();&&&&&&&&&&& ser.Serialize(ms, ds);&&&&&&&&&&& byte[] buffer = ms.ToArray();&&&&&&&&&&&&&&&&&& }
&&&&&&& [WebMethod(Description = "直接返回DataSetSurrogate对象,并且Binary序列化后的字节数组")]&&&&&&& public byte[] GetDataSetSurrogateBytes() &&&&&&& {&&&&&&&&&&& DataSet ds = GetDataSet();
&&&&&&&&&&& DataSetSurrogate dss = new DataSetSurrogate(ds);&&&&&&&&&&& BinaryFormatter ser = new BinaryFormatter();&&&&&&&&&&& MemoryStream ms = new MemoryStream();&&&&&&&&&&& ser.Serialize(ms, dss);&&&&&&&&&&& byte[] buffer = ms.ToArray();&&&&&&&&&&&&&&&&&& }
&&&&&&& [WebMethod(Description="直接返回DataSetSurrogate对象,并且binary序列化后并且zip压缩的字节数组")]&&&&&&& public byte[] GetDataSetSurrogateZipBytes()&&&&&&& {&&&&&&&&&&& DataSet ds = GetDataSet();&&&&&&&&&&& DataSetSurrogate dss = new DataSetSurrogate(ds);&&&&&&&&&&& BinaryFormatter ser = new BinaryFormatter();&&&&&&&&&&& MemoryStream ms = new MemoryStream();&&&&&&&&&&& ser.Serialize(ms, dss);&&&&&&&&&&& byte[] buffer = ms.ToArray();&&&&&&&&&&& byte[] bufferZip = ComPress(buffer);&&&&&&&&&&& return bufferZ&&&&&&& }
&&&&&&& //压缩方法&&&&&&& public byte[] ComPress(byte[] data)&&&&&&& {&&&&&&&&&&& try&&&&&&&&&&& {&&&&&&&&&&&&&&& MemoryStream ms = new MemoryStream();&&&&&&&&&&&&&&& Stream zipStream =&&&&&&&&&&&&&&& zipStream = new GZipStream(ms, CompressionMode.Compress, true);&&&&&&&&&&&&&&& zipStream.Write(data, 0, data.Length);&& &&&&&&&&&&&&&&& zipStream.Close();&&&&&&&&&&&&&&& ms.Position = 0;&&&&&&&&&&&&&&& byte[] compressed_data = new byte[ms.Length];&&&&&&&&&&&&&&& ms.Read(compressed_data, 0, int.Parse(ms.Length.ToString()));&&&&&&&&&&&&&&& return compressed_&&&&&&&&&&& }&&&&&&&&&&& catch &&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }
上面的代码在网上比较多,经过测试也确实能优化实体的传输,上面测试的数据如下:
& (1)直接返回DataSet对象
&&&&&&&&&&&速度为00:00:01.& (2)返回DataSet对象用Binary序列化后的字节数组
&&&&&&&&&& 速度比(1)快,传输的大小为30589& (3)返回DataSetSurrogate对象用Binary序列化后的 字节数组
&&&&&&& &速度比(1)快,传输的大小为12450& (4)返回DataSetSurrogate对象用Binary序列化并Zip 压缩后的字节数组
&&&& 速度比(1)快,传输的大小为4540
这四种方式第2,3,4的速度差不多,不过我的数据量不大,在数据量大的情况下,这种优势将更新明显,所以建议用(4)种方式来增加实体实例化的性能
上面的例子只是针对DataSet进行相关的优化,我们知道在webservice中如果直接使用复合类型,将产生大量的wsdl描述信息,这样生成的xml将是很大的,
为了优化webservice的复合类型,最后还是对其进行序列化传输,序列化传输,使用的类库在客户端和服务端必须一样,必须标志为[Serialization],不然将会报错,上面的DataSetSurrogate必须新建一个类库,在客户端和服务端引用
对于其他的实体对象,我们也可以通过序列化来实现复合类型
缺点:webservice为不同的语言之间的调用提供了一个快速便捷的方法,但在跨平台的情况下,因为序列化和反序列化对二进制进行转换的方式不一样,所以此种功能将会受到限制,看具体平台的业务要求而定。
例子程序:服务端
阅读(...) 评论()Android-XML反序列化(XML解析)、JSON序列化与反序列化(JSON生成与解析)(含json smart类)_安卓应用_安卓/混合APP/小程序_胜行天下网
保存到桌面&
Android-XML反序列化(XML解析)、JSON序列化与反序列化(JSON生成与解析)(含json smart类)
时间: 17:52:33&&
作者:江节胜&&
来源:胜行天下&&
JSONHelper.java
package com.jiangjiesheng.
import java.lang.reflect.A
import java.lang.reflect.F
import java.lang.reflect.M
import java.lang.reflect.ParameterizedT
import java.lang.reflect.T
import java.text.SimpleDateF
import java.util.ArrayL
import java.util.C
import java.util.D
import java.util.HashM
import java.util.HashS
import java.util.I
import java.util.L
import java.util.L
import java.util.M
import java.util.S
import org.json.JSONA
import org.json.JSONE
import org.json.JSONO
import org.json.JSONS
import android.util.L
* 类说明 :支持JSON 序列化和反序列化
* @author 作者 江节胜 E-mail:
* @version 创建时间:日 下午2:05:44
public class JSONHelper {
private static String TAG = "JSONHelper";
* 将对象转换成Json字符串
* @param obj
* @return json类型字符串
public static String toJSON(Object obj) {
JSONStringer js = new JSONStringer();
serialize(js, obj);
return js.toString();
* 序列化为JSON
* @param js
* @param o
待需序列化的对象
private static void serialize(JSONStringer js, Object o) {
if (isNull(o)) {
js.value(null);
} catch (JSONException e) {
e.printStackTrace();
Class&?& clazz = o.getClass();
if (isObject(clazz)) { // 对象
serializeObject(js, o);
} else if (isArray(clazz)) { // 数组
serializeArray(js, o);
} else if (isCollection(clazz)) { // 集合
Collection&?& collection = (Collection&?&)
serializeCollect(js, collection);
} else if (isMap(clazz)) { // 集合
HashMap&?, ?& collection = (HashMap&?, ?&)
serializeMap(js, collection);
} else { // 单个值
js.value(o);
} catch (JSONException e) {
e.printStackTrace();
* 序列化数组
* @param js
* @param array
private static void serializeArray(JSONStringer js, Object array) {
js.array();
for (int i = 0; i & Array.getLength(array); ++i) {
Object o = Array.get(array, i);
serialize(js, o);
js.endArray();
} catch (Exception e) {
e.printStackTrace();
* 序列化集合
* @param js
* @param collection
private static void serializeCollect(JSONStringer js,
Collection&?& collection) {
js.array();
for (Object o : collection) {
serialize(js, o);
js.endArray();
} catch (Exception e) {
e.printStackTrace();
* 序列化Map
* @param js
* @param map
private static void serializeMap(JSONStringer js, Map&?, ?& map) {
js.object();
@SuppressWarnings("unchecked")
Map&String, Object& valueMap = (Map&String, Object&)
Iterator&Map.Entry&String, Object&& it = valueMap.entrySet()
.iterator();
while (it.hasNext()) {
Map.Entry&String, Object& entry = (Map.Entry&String, Object&) it
js.key(entry.getKey());
serialize(js, entry.getValue());
js.endObject();
} catch (Exception e) {
e.printStackTrace();
* 序列化对象
* @param js
* @param obj
待序列化对象
private static void serializeObject(JSONStringer js, Object obj) {
js.object();
Class&? extends Object& objClazz = obj.getClass();
Method[] methods = objClazz.getDeclaredMethods();
Field[] fields = objClazz.getDeclaredFields();
for (Field field : fields) {
String fieldType = field.getType().getSimpleName();
String fieldGetName = parseMethodName(field.getName(),
if (!haveMethod(methods, fieldGetName)) {
Method fieldGetMet = objClazz.getMethod(fieldGetName,
new Class[] {});
Object fieldVal = fieldGetMet.invoke(obj, new Object[] {});
String result =
if ("Date".equals(fieldType)) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.US);
result = sdf.format((Date) fieldVal);
if (null != fieldVal) {
result = String.valueOf(fieldVal);
js.key(field.getName());
serialize(js, result);
} catch (Exception e) {
js.endObject();
} catch (Exception e) {
e.printStackTrace();
* 判断是否存在某属性的 get方法
* @param methods
引用方法的数组
* @param fieldMethod
* @return true或者false
public static boolean haveMethod(Method[] methods, String fieldMethod) {
for (Method met : methods) {
if (fieldMethod.equals(met.getName())) {
* 拼接某属性的 get或者set方法
* @param fieldName
* @param methodType
* @return 方法名称
public static String parseMethodName(String fieldName, String methodType) {
if (null == fieldName || "".equals(fieldName)) {
return methodType + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
* 给字段赋值
* @param obj
* @param valMap
public static void setFieldValue(Object obj, Map&String, String& valMap) {
Class&?& cls = obj.getClass();
// 取出bean里的所有方法
Method[] methods = cls.getDeclaredMethods();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String setMetodName = parseMethodName(field.getName(), "set");
if (!haveMethod(methods, setMetodName)) {
Method fieldMethod = cls.getMethod(setMetodName,
field.getType());
String value = valMap.get(field.getName());
if (null != value && !"".equals(value)) {
String fieldType = field.getType().getSimpleName();
if ("String".equals(fieldType)) {
fieldMethod.invoke(obj, value);
} else if ("Date".equals(fieldType)) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.US);
Date temp = sdf.parse(value);
fieldMethod.invoke(obj, temp);
} else if ("Integer".equals(fieldType)
|| "int".equals(fieldType)) {
Integer intval = Integer.parseInt(value);
fieldMethod.invoke(obj, intval);
} else if ("Long".equalsIgnoreCase(fieldType)) {
Long temp = Long.parseLong(value);
fieldMethod.invoke(obj, temp);
} else if ("Double".equalsIgnoreCase(fieldType)) {
Double temp = Double.parseDouble(value);
fieldMethod.invoke(obj, temp);
} else if ("Boolean".equalsIgnoreCase(fieldType)) {
Boolean temp = Boolean.parseBoolean(value);
fieldMethod.invoke(obj, temp);
System.out.println("setFieldValue not supper type:"
+ fieldType);
} catch (Exception e) {
* bean对象转Map
* @param obj
* @return map集合
public static Map&String, String& beanToMap(Object obj) {
Class&?& cls = obj.getClass();
Map&String, String& valueMap = new HashMap&String, String&();
// 取出bean里的所有方法
Method[] methods = cls.getDeclaredMethods();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
String fieldType = field.getType().getSimpleName();
String fieldGetName = parseMethodName(field.getName(), "get");
if (!haveMethod(methods, fieldGetName)) {
Method fieldGetMet = cls
.getMethod(fieldGetName, new Class[] {});
Object fieldVal = fieldGetMet.invoke(obj, new Object[] {});
String result =
if ("Date".equals(fieldType)) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.CHINA);
result = sdf.format((Date) fieldVal);
if (null != fieldVal) {
result = String.valueOf(fieldVal);
valueMap.put(field.getName(), result);
} catch (Exception e) {
return valueM
* 给对象的字段赋值
* @param obj
* @param fieldSetMethod
* @param fieldType
* @param value
public static void setFiedlValue(Object obj, Method fieldSetMethod,
String fieldType, Object value) {
if (null != value && !"".equals(value)) {
if ("String".equals(fieldType)) {
fieldSetMethod.invoke(obj, value.toString());
} else if ("Date".equals(fieldType)) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss", Locale.CHINA);
Date temp = sdf.parse(value.toString());
fieldSetMethod.invoke(obj, temp);
} else if ("Integer".equals(fieldType)
|| "int".equals(fieldType)) {
Integer intval = Integer.parseInt(value.toString());
fieldSetMethod.invoke(obj, intval);
} else if ("Long".equalsIgnoreCase(fieldType)) {
Long temp = Long.parseLong(value.toString());
fieldSetMethod.invoke(obj, temp);
} else if ("Double".equalsIgnoreCase(fieldType)) {
Double temp = Double.parseDouble(value.toString());
fieldSetMethod.invoke(obj, temp);
} else if ("Boolean".equalsIgnoreCase(fieldType)) {
Boolean temp = Boolean.parseBoolean(value.toString());
fieldSetMethod.invoke(obj, temp);
fieldSetMethod.invoke(obj, value);
Log.e(TAG, TAG + "&&&&setFiedlValue -& not supper type"
+ fieldType);
} catch (Exception e) {
// Log.e(TAG, TAG + "&&&&&&&&&&set value error.",e);
e.printStackTrace();
* 方法说明:字符串转json对象(反序列化) 新增
* @author 江节胜 ,E-mail:
* @version 创建时间: 下午3:47:12
* @param jsonStr
* @throws JSONException
public static JSONObject parseJSONObject(String jsonStr)
throws JSONException {
JSONObject jo =
jo = new JSONObject(jsonStr);
if (isNull(jo)) {
* 反序列化简单对象
* !!!注意使用parseJSONObject()处理字符串转json对象
* @param jo
* @param clazz
实体类类型
* @return 反序列化后的实例
* @throws JSONException
public static &T& T parseObject(JSONObject jo, Class&T& clazz)
throws JSONException {
if (clazz == null || isNull(jo)) {
T obj = newInstance(clazz);
if (obj == null) {
if (isMap(clazz)) {
setField(obj, jo);
// 取出bean里的所有方法
Method[] methods = clazz.getDeclaredMethods();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
String setMetodName = parseMethodName(f.getName(), "set");
if (!haveMethod(methods, setMetodName)) {
Method fieldMethod = clazz.getMethod(setMetodName,
f.getType());
setField(obj, fieldMethod, f, jo);
} catch (Exception e) {
e.printStackTrace();
* 反序列化简单对象
* !!!使用parseJSONObject()处理字符串转json对象
* @param jsonStr
json字符串
* @param clazz
实体类类型
* @return 反序列化后的实例
* @throws JSONException
public static &T& T parseObject(String jsonStr, Class&T& clazz)
throws JSONException {
if (clazz == null || jsonStr == null || jsonStr.length() == 0) {
JSONObject jo =
jo = new JSONObject(jsonStr);
if (isNull(jo)) {
return parseObject(jo, clazz);
* 反序列化数组对象
* @param ja
* @param clazz
实体类类型
* @return 反序列化后的数组
public static &T& T[] parseArray(JSONArray ja, Class&T& clazz) {
if (clazz == null || isNull(ja)) {
int len = ja.length();
@SuppressWarnings("unchecked")
T[] array = (T[]) Array.newInstance(clazz, len);
for (int i = 0; i & ++i) {
JSONObject jo = ja.getJSONObject(i);
T o = parseObject(jo, clazz);
array[i] =
} catch (JSONException e) {
e.printStackTrace();
* 反序列化数组对象
* @param jsonStr
json字符串
* @param clazz
实体类类型
* @return 序列化后的数组
public static &T& T[] parseArray(String jsonStr, Class&T& clazz) {
if (clazz == null || jsonStr == null || jsonStr.length() == 0) {
JSONArray jo =
jo = new JSONArray(jsonStr);
} catch (JSONException e) {
e.printStackTrace();
if (isNull(jo)) {
return parseArray(jo, clazz);
* 反序列化泛型集合
* @param ja
* @param collectionClazz
* @param genericType
实体类类型
* @throws JSONException
@SuppressWarnings("unchecked")
public static &T& Collection&T& parseCollection(JSONArray ja,
Class&?& collectionClazz, Class&T& genericType)
throws JSONException {
if (collectionClazz == null || genericType == null || isNull(ja)) {
Collection&T& collection = (Collection&T&) newInstance(collectionClazz);
for (int i = 0; i & ja.length(); ++i) {
JSONObject jo = ja.getJSONObject(i);
T o = parseObject(jo, genericType);
collection.add(o);
} catch (JSONException e) {
e.printStackTrace();
* 反序列化泛型集合
* @param jsonStr
json字符串
* @param collectionClazz
* @param genericType
实体类类型
* @return 反序列化后的数组
* @throws JSONException
public static &T& Collection&T& parseCollection(String jsonStr,
Class&?& collectionClazz, Class&T& genericType)
throws JSONException {
if (collectionClazz == null || genericType == null || jsonStr == null
|| jsonStr.length() == 0) {
JSONArray jo =
// 如果为数组,则此处转化时,需要去掉前面的键,直接后面的[]中的值
int index = jsonStr.indexOf("[");
String arrayString =
// 获取数组的字符串
if (-1 != index) {
arrayString = jsonStr.substring(index);
// 如果为数组,使用数组转化
if (null != arrayString) {
jo = new JSONArray(arrayString);
jo = new JSONArray(jsonStr);
} catch (JSONException e) {
e.printStackTrace();
if (isNull(jo)) {
return parseCollection(jo, collectionClazz, genericType);
* 根据类型创建对象
* @param clazz
待创建实例的类型
* @return 实例对象
* @throws JSONException
@SuppressWarnings({ "unchecked", "rawtypes" })
private static &T& T newInstance(Class&T& clazz) throws JSONException {
if (clazz == null)
if (clazz.isInterface()) {
if (clazz.equals(Map.class)) {
obj = (T) new HashMap();
} else if (clazz.equals(List.class)) {
obj = (T) new ArrayList();
} else if (clazz.equals(Set.class)) {
obj = (T) new HashSet();
throw new JSONException("unknown interface: " + clazz);
obj = clazz.newInstance();
} catch (Exception e) {
throw new JSONException("unknown class type: " + clazz);
* 设定Map的值
* @param obj
待赋值字段的对象
* @param jo
private static void setField(Object obj, JSONObject jo) {
@SuppressWarnings("unchecked")
Iterator&String& keyIter = jo.keys();
@SuppressWarnings("unchecked")
Map&String, Object& valueMap = (Map&String, Object&)
while (keyIter.hasNext()) {
key = (String) keyIter.next();
value = jo.get(key);
valueMap.put(key, value);
} catch (JSONException e) {
e.printStackTrace();
* 设定字段的值
* @param obj
待赋值字段的对象
* @param fieldSetMethod
字段方法名
* @param field
* @param jo
private static void setField(Object obj, Method fieldSetMethod,
Field field, JSONObject jo) {
String name = field.getName();
Class&?& clazz = field.getType();
if (isArray(clazz)) { // 数组
Class&?& c = clazz.getComponentType();
JSONArray ja = jo.optJSONArray(name);
if (!isNull(ja)) {
Object array = parseArray(ja, c);
setFiedlValue(obj, fieldSetMethod, clazz.getSimpleName(),
} else if (isCollection(clazz)) { // 泛型集合
// 获取定义的泛型类型
Class&?& c =
Type gType = field.getGenericType();
if (gType instanceof ParameterizedType) {
ParameterizedType ptype = (ParameterizedType) gT
Type[] targs = ptype.getActualTypeArguments();
if (targs != null && targs.length & 0) {
Type t = targs[0];
c = (Class&?&)
JSONArray ja = jo.optJSONArray(name);
if (!isNull(ja)) {
Object o = parseCollection(ja, clazz, c);
setFiedlValue(obj, fieldSetMethod, clazz.getSimpleName(), o);
} else if (isSingle(clazz)) { // 值类型
Object o = jo.opt(name);
if (o != null) {
setFiedlValue(obj, fieldSetMethod, clazz.getSimpleName(), o);
} else if (isObject(clazz)) { // 对象
JSONObject j = jo.optJSONObject(name);
if (!isNull(j)) {
Object o = parseObject(j, clazz);
setFiedlValue(obj, fieldSetMethod, clazz.getSimpleName(), o);
} else if (isList(clazz)) { // 列表
// JSONObject j = jo.optJSONObject(name);
// if (!isNull(j)) {
// Object o = parseObject(j, clazz);
// f.set(obj, o);
throw new Exception("unknow type!");
} catch (Exception e) {
e.printStackTrace();
* 设定字段的值
* @param obj
待赋值字段的对象
* @param field
* @param jo
@SuppressWarnings("unused")
private static void setField(Object obj, Field field, JSONObject jo) {
String name = field.getName();
Class&?& clazz = field.getType();
if (isArray(clazz)) { // 数组
Class&?& c = clazz.getComponentType();
JSONArray ja = jo.optJSONArray(name);
if (!isNull(ja)) {
Object array = parseArray(ja, c);
field.set(obj, array);
} else if (isCollection(clazz)) { // 泛型集合
// 获取定义的泛型类型
Class&?& c =
Type gType = field.getGenericType();
if (gType instanceof ParameterizedType) {
ParameterizedType ptype = (ParameterizedType) gT
Type[] targs = ptype.getActualTypeArguments();
if (targs != null && targs.length & 0) {
Type t = targs[0];
c = (Class&?&)
JSONArray ja = jo.optJSONArray(name);
if (!isNull(ja)) {
Object o = parseCollection(ja, clazz, c);
field.set(obj, o);
} else if (isSingle(clazz)) { // 值类型
Object o = jo.opt(name);
if (o != null) {
field.set(obj, o);
} else if (isObject(clazz)) { // 对象
JSONObject j = jo.optJSONObject(name);
if (!isNull(j)) {
Object o = parseObject(j, clazz);
field.set(obj, o);
} else if (isList(clazz)) { // 列表
JSONObject j = jo.optJSONObject(name);
if (!isNull(j)) {
Object o = parseObject(j, clazz);
field.set(obj, o);
throw new Exception("unknow type!");
} catch (Exception e) {
e.printStackTrace();
* 判断对象是否为空
* @param obj
private static boolean isNull(Object obj) {
if (obj instanceof JSONObject) {
return JSONObject.NULL.equals(obj);
return obj ==
* 判断是否是值类型
* @param clazz
private static boolean isSingle(Class&?& clazz) {
return isBoolean(clazz) || isNumber(clazz) || isString(clazz);
* 是否布尔值
* @param clazz
public static boolean isBoolean(Class&?& clazz) {
return (clazz != null)
&& ((Boolean.TYPE.isAssignableFrom(clazz)) || (Boolean.class
.isAssignableFrom(clazz)));
* 是否数值
* @param clazz
public static boolean isNumber(Class&?& clazz) {
return (clazz != null)
&& ((Byte.TYPE.isAssignableFrom(clazz))
|| (Short.TYPE.isAssignableFrom(clazz))
|| (Integer.TYPE.isAssignableFrom(clazz))
|| (Long.TYPE.isAssignableFrom(clazz))
|| (Float.TYPE.isAssignableFrom(clazz))
|| (Double.TYPE.isAssignableFrom(clazz)) || (Number.class
.isAssignableFrom(clazz)));
* 判断是否是字符串
* @param clazz
public static boolean isString(Class&?& clazz) {
return (clazz != null)
&& ((String.class.isAssignableFrom(clazz))
|| (Character.TYPE.isAssignableFrom(clazz)) || (Character.class
.isAssignableFrom(clazz)));
* 判断是否是对象
* @param clazz
private static boolean isObject(Class&?& clazz) {
return clazz != null && !isSingle(clazz) && !isArray(clazz)
&& !isCollection(clazz) && !isMap(clazz);
* 判断是否是数组
* @param clazz
public static boolean isArray(Class&?& clazz) {
return clazz != null && clazz.isArray();
* 判断是否是集合
* @param clazz
public static boolean isCollection(Class&?& clazz) {
return clazz != null && Collection.class.isAssignableFrom(clazz);
* 判断是否是Map
* @param clazz
public static boolean isMap(Class&?& clazz) {
return clazz != null && Map.class.isAssignableFrom(clazz);
* 判断是否是列表
* @param clazz
public static boolean isList(Class&?& clazz) {
return clazz != null && List.class.isAssignableFrom(clazz);
XMLHelper.java
package com.jiangjiesheng.
import java.io.C
import java.io.StringR
import java.lang.reflect.F
import java.util.ArrayL
import java.util.L
import org.xmlpull.v1.XmlPullP
import android.content.ContentV
import android.util.X
&* 类说明 :解析XML实体(仅仅支持XML反序列化)
&* @author 作者 江节胜 E-mail:&
&* @version 创建时间:日 下午2:07:30&
@SuppressWarnings("unchecked")
public class XMLHelper {
public static &T& T parseModel(final Object result,
final Class&?& clazzModel) {
final T model = (T) newInstance(clazzModel);
parse(result + "", new OnXmlCallback() {
public boolean onTagStart(String tagName, XmlPullParser xmlParser) {
xmlToModel(xmlParser, model, tagName);
public boolean onTagEnd(String tagName) {
* 方法说明: 解析List,文件名要和数据中的父节点一样,并加上Model 单个model不需要在文件名上加Model,应该是分割数据的标记.
public static &T& List&T& parseList(final Object result,
final Class&?& clazzModel) {
final List&T& lstModels = new ArrayList&T&();
final String modelName = clazzModel.getSimpleName()
.replace("Model", "");// 注意这里
parse(result + "", new OnXmlCallback() {
private T itemM
public boolean onTagStart(String tagName, XmlPullParser xmlParser) {
if (tagName.equalsIgnoreCase(modelName)) {
itemModel = (T) clazzModel.newInstance();
} catch (Exception e) {
e.printStackTrace();
xmlToModel(xmlParser, itemModel, tagName);
public boolean onTagEnd(String tagName) {
if (tagName.equalsIgnoreCase(modelName) && itemModel != null) {
lstModels.add(itemModel);
return lstM
public static void parse(String xmlStr, OnXmlCallback onXmlCallback) {
parseXml(xmlStr, onXmlCallback);
} catch (Exception e) {
e.printStackTrace();
public static String valueString(XmlPullParser xmlParser,
String... defaultValue) {
return xmlParser.nextText();
} catch (Exception e) {
return defaultValue.length & 0 ? defaultValue[0] : "";
public static boolean valueBoolean(XmlPullParser xmlParser,
boolean... defaultValue) {
return Boolean.parseBoolean(valueString(xmlParser));
} catch (Exception e) {
return defaultValue.length & 0 ? defaultValue[0] :
public static int valueInt(XmlPullParser xmlParser, int... defaultValue) {
return Integer.parseInt(valueString(xmlParser));
} catch (Exception e) {
return defaultValue.length & 0 ? defaultValue[0] : 0;
public static long valueLong(XmlPullParser xmlParser, int... defaultValue) {
return Long.parseLong(valueString(xmlParser));
} catch (Exception e) {
return defaultValue.length & 0 ? defaultValue[0] : 0;
public static double valueDouble(XmlPullParser xmlParser,
double... defaultValue) {
return Double.parseDouble(valueString(xmlParser));
} catch (Exception e) {
return defaultValue.length & 0 ? defaultValue[0] : 0;
public static void xmlToModel(XmlPullParser xmlParser, Object model,
String fieldName) {
Object value =
Field field = model.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
if (field.getType() == String.class) {
value = XMLHelper.valueString(xmlParser);
} else if (field.getType() == Integer.TYPE) {
value = XMLHelper.valueInt(xmlParser);
} else if (field.getType() == Long.TYPE) {
value = XMLHelper.valueLong(xmlParser);
} else if (field.getType() == Double.TYPE) {
value = XMLHelper.valueDouble(xmlParser);
} else if (field.getType() == Boolean.TYPE) {
value = XMLHelper.valueBoolean(xmlParser);
throw new IllegalArgumentException("ModelToContentValues, key:"
+ fieldName + "'s value type is: " + field.getType());
field.set(model, value);
} catch (Exception e) {
// e.printStackTrace();
public static void closeStream(Closeable stream) {
if (stream != null) {
stream.close();
} catch (Exception e) {
public static Object newInstance(Class&?& clazz) {
return clazz.newInstance();
} catch (Exception e) {
* convert model to ContentValues &BR/&
* &H1&NOTE: model's fields must be same with columns.&/H1&
* @param model
* @param columns
public static ContentValues modelToContentValues(Object model,
String[] columns) {
ContentValues values = new ContentValues();
Class&?& clazz = model.getClass();
for (int i = 0; i & columns. i++) {
String key = columns[i];
Field field = clazz.getDeclaredField(key);
field.setAccessible(true);
Object value = field.get(model);
if (field.getType() == String.class) {
values.put(key, (String) value);
} else if (field.getType() == Boolean.TYPE) {
values.put(key, (Boolean) value);
} else if (field.getType() == Integer.TYPE) {
values.put(key, (Integer) value);
} else if (field.getType() == Long.TYPE) {
values.put(key, (Long) value);
} else if (field.getType() == Double.TYPE) {
values.put(key, (Double) value);
} else if (field.getType() == Float.TYPE) {
values.put(key, (Float) value);
} else if (field.getType() == Short.TYPE) {
values.put(key, (Short) value);
} else if (field.getType() == Byte.TYPE) {
values.put(key, (Byte) value);
throw new IllegalArgumentException(
"ModelToContentValues, key:" + key
+ "'s value type is: " + field.getType());
} catch (Exception e) {
throw new IllegalStateException("ModelToContentValues.error "
+ e.getMessage());
public static void parseXml(String xmlStr, OnXmlCallback onXmlCallback)
throws Exception {
XmlPullParser xmlParser = Xml.newPullParser();
xmlParser.setInput(new StringReader(xmlStr));
int evtType = xmlParser.getEventType();
while (evtType != XmlPullParser.END_DOCUMENT) {
String tagName = xmlParser.getName();
switch (evtType) {
case XmlPullParser.START_TAG:
if (onXmlCallback.onTagStart(tagName, xmlParser)) {
case XmlPullParser.END_TAG:
if (onXmlCallback.onTagEnd(tagName)) {
evtType = xmlParser.next();
public static interface OnXmlCallback {
* start tag
* @param tagName
* @param value
* @return if true T Or continue.
public boolean onTagStart(String tagName, XmlPullParser xmlParser);
* @param tagName
* @return if true T Or continue.
public boolean onTagEnd(String tagName);
标签:&&&&&&&&&&&&
&|&&|&&|&&|&&|&&|&&|&&|&

我要回帖

更多关于 番茄表单 小程序6 的文章

 

随机推荐