首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

XML和json必须要一个字段一个字段的解析吗,该如何解决

2013-12-20 
XML和json必须要一个字段一个字段的解析吗大家好,我们平时定义协议的时候,喜欢把数据流定义成XML或者json

XML和json必须要一个字段一个字段的解析吗
大家好,我们平时定义协议的时候,喜欢把数据流定义成XML或者json格式,解析的时候,必须要一个字段一个字段的解析吗?
有没有好一点的解析工具,直接序列化或者反序列化?
[解决办法]
dom4j,sax,jdom,都能解析XML,不用自己写文本解析器。
json用jackson,或者google开源的json解析器都是OK的。
[解决办法]
很简单的数据一般直接读成数据流了   比较格式化的xml文件就用Dom解析吧 很简单的
json没怎么用过  看别人用好像也就几行  没感觉
[解决办法]
Dom效率还是蛮高的
[解决办法]
Android 下应该用 Pull,我刚写了一篇博客《Android 下用 Pull 解析和生成 XML》
楼主可以看看:http://blog.csdn.net/joneeky/article/details/17080127
[解决办法]
json的话jackson gson,xml的话jaxb
[解决办法]
根据放射机制,自己写点代码就好了呀

/**
  * 把json转换成集合
  * @param jsonArr 可以是JSONObject对象或json字符串
  * @param clazz
  * @return
  * @throws Exception
  */
public <T> List<T> jsonToList(Object jsonArr, Class clazz) throws Exception {
List list = new ArrayList();
JSONArray json = (jsonArr instanceof JSONArray ? (JSONArray) jsonArr : new JSONArray(jsonArr.toString()));
for (int i = 0; i < json.length(); i++) {
list.add(jsonToBean(json.get(i), clazz));
}
return list;
}


/**
 * 把json转换成对象
 * @param jsonObj 可以是JSONObject对象或json字符串
 * @param clazz
 * @return
 * @throws Exception
 */
public <T> T jsonToBean(Object jsonObj, Class clazz) throws Exception {
JSONObject json = (jsonObj instanceof JSONObject ? (JSONObject) jsonObj : new JSONObject(jsonObj.toString()));
Object object = clazz.newInstance();Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
Object value = null;try {value = json.get(getProp(methods[i]));} catch (Exception e) {}
setProp(methods[i], object, value);
}
return (T) object;
}

/**
 * 给对象的属性赋值
 * @param method
 * @param object
 * @param value
 * @return
 */
public Object setProp(Method method, Object object, Object value) {
if (null == method 
[解决办法]
 null == object 
[解决办法]
 null == value 
[解决办法]
 !isPropMethod(method, SET_PROP)) {return object;}
String pn = method.getParameterTypes()[0].getName(), val = value.toString();
if (pn.equals("short") 
[解决办法]
 pn.equals(Short.class.getName())) {
try {method.invoke(object, Short.parseShort(val));} catch (Exception e) {}
} else if (pn.equals("int") 
[解决办法]
 pn.equals(Integer.class.getName())) {
try {method.invoke(object, Integer.parseInt(val));} catch (Exception e) {}
} else if (pn.equals("long") 
[解决办法]
 pn.equals(Long.class.getName())) {
try {method.invoke(object, Long.parseLong(val));} catch (Exception e) {}
} else if (pn.equals(String.class.getName())) {
try {method.invoke(object, val);} catch (Exception e) {}
} else if (pn.equals("float") 
[解决办法]
 pn.equals(Float.class.getName())) {
try {method.invoke(object, Float.parseFloat(val));} catch (Exception e) {}
} else if (pn.equals("double") 
[解决办法]
 pn.equals(Double.class.getName())) {
try {method.invoke(object, Double.parseDouble(val));} catch (Exception e) {}
} else if (pn.equals(BigDecimal.class.getName())) {


try {method.invoke(object, new BigDecimal(val));} catch (Exception e) {}
} else if (pn.equals("boolean") 
[解决办法]
 pn.equals(Boolean.class.getName())) {
try {method.invoke(object, "1".equals(val) ? true : ("0".equals(val) ? false : Boolean.parseBoolean(val)));} catch (Exception e) {}
} else if (pn.equals(Date.class.getName())) {
try {
if (value.getClass().getName().equals(Date.class.getName())) {
method.invoke(object, value);
} else {
method.invoke(object, val.length() <= 10 ? DateUtil.get().formatDate().parse(val) : DateUtil.get().formatDateTime().parse(val));
}
} catch (Exception e) {}
} else if (pn.equals(Map.class.getName())) {
try {method.invoke(object, jsonToMap(value));} catch (Exception e) {}
}
return object;
}


/**
 * 根据set或get方法获得属性名称
 * @param method
 * @return
 */
public String getProp(Method method) {
if (isPropMethod(method, SET_PROP) 
[解决办法]
 isPropMethod(method, GET_PROP)) {
String mn = method.getName();
return mn.substring(3, 4).toLowerCase() + mn.substring(4, mn.length());
}
return "";
}

热点排行