javalist对象转xml_将ListT⽣成XML⽂档(字串),将XML⽂
档(字串)解析。。。
很多刚开始涉猎web开发的猿友可能会遇到⼀个情况,就是将服务器端的数据传回前端,如果前端是浏览器的话是没有什么问题的,把服务器的各种对象属性通过OGNL或者JSTL等等很轻松的呈现出来。可如果前端是JavaSE开发的桌⾯应⽤或者Android应⽤,就⽐较⿇烦了。
这时我们只能传回去⼀些Header或者Content,也就是头和字串,所以也就产⽣了把字串格式规划好,传回去然后按照⼀定的规则解析出来,得到需要的属性,⽽我们常⽤的⽆⾮是XML与JSON两种格式数据。
对于JSON与XML在性能与格式上各有优点,XMl格式统⼀,符合标准,安全,缺点就是格式复杂,前后端解析需要⼤量的代码,JSON的话格式简单,易于读写,但是相对XML通⽤性还不是特别强。
使⽤XML传输对象的时候,往往我们需要将⼀个对象的各种属性转化成字符串构建成⼀个XML,然后解析的时候再将XML⽂件或者字符串取出来,赋值给对象的属性,由此⽣成⼀个具有有效属性的对象。
⽽每个对象的属性必然是不同的,所以经常我们会为每个对象写⼀套解析⽅法,所以庞⼤的代码⼯作量就产⽣了,那么有没有简单⼀点的⽅法呢?我是这样做的,话不多说,先上效果图。
public class Person {
static final private String SPLIT_MARK = "#";
private int id;
private String username;// 账号
private String password;// 密码
private String name;// 名称
private String bound;// 绑定
...
}
执⾏代码
public static void main(String[] args) {
Person person = new Person();
person.setId(2);
person.setName("xiao南⽠");
person.setUsername("abc");
person.setPassword("123");
person.setBound("!@#");
String sXml=ParseList(Arrays.asList(person), Person.class);
System.out.println(sXml);
}
结果
图截取不下来,在⽂件中或者浏览器格式是很好的,把输出结果给⼤家复制出来看<_persons><_person>2abc123xiao南⽠!@#
然后再将⽣成的xml字符串转回对象
public static void main(String[] args) {
Person person = new Person();
person.setId(2);
person.setName("xiao南⽠");
person.setUsername("abc");
person.setPassword("123");
person.setBound("!@#");
String sXml = ParseList(Arrays.asList(person), Person.class);
List persons = ParseXML(sXml, Person.class);
Person person2 = (0);
System.out.println(person);
System.out.println(person2);
}
结果(重写的toString⽅法)
这就是List与XML的正向逆向解析,如果是⼀个对象就将这个对象转换为List即可。再测试⼀个Java对象
public class Location {
private int id;
private double longi;// 经度
private double lati;// 纬度
private String address;// 位置描述
private Timestamp lastTime;// 最后修改时间
private String recordPath;// 位置记录存储路径
private Person person;// 何⼈的位置
...
}
public static void main(String[] args) {
Person person=new Person();
person.setId(7);
Location location=new Location();
location.setId(3);
location.setLongi(12.34);
location.setLati(56.78);
location.setLastTime(new Timestamp(System.currentTimeMillis()));
location.setAddress("⼭西");
location.setRecordPath("F:\\");
location.setPerson(person);
String sXml=ParseList(Arrays.asList(location), Location.class);
List locations=ParseXML(sXml, Location.class);
Location (0);
System.out.println(location);
System.out.println(location2);
}
结果
这些⾃定义的JavaBean有⼀些特点需要记住
1.所有属性只能是8种基本类型,即byte,short,int,long,float,double,boolean,String以及Timestamp。
2.可以有其他类型对象作为属性,但其他类型对象也必须符合这些规则。
3.对象中必须有id属性,名字必须是id且必须是int类型,这是为了标识null对象与标识其他对象(外键)做的。
4.null对象也会解析成xml,只不过id为-1,表⽰null对象,当然如果xml中如果有id属性为-1的也会解析成null对象。
5.所有外键(其他⾃定义的对象作为属性)在xml中只会保存id属性,为了防⽌外键为⾃⼰时的⽆限迭代。
因为我们服务器的⼤多数Bean都是数据库来的,或者存或者取,所以虽然⽀持的类型不多,不过也应该够⽤了。前台⽤的话只要把响应的Bean的class与这个模型拷贝过去即可。
希望能帮助⼤家。
如果有什么不对或者更好的建议,希望⼤家提出来,谢谢,因为是第⼀次写,不⾜之处多多指教。
模型源码,使⽤⽅式以及思路注释⾥都有java xml是什么
public class BeanModel2 {
private static final String ATTR_ID = "id";// bean的id属性
private static final int NULL_ID = -1;
// 根据bean⾃动构建xml的root名字
public static String GetRootName(Class> bean) {
String root_name = "_" + SimpleName().toLowerCase() + "s";
return root_name;
}
// 根据bean⾃动构建xml的child名字
public static String GetElemName(Class> bean) {
String elem_name = "_" + SimpleName().toLowerCase();
return elem_name;
}
// 根据bean和field构建xml中child的attribute名字
public static String GetAttrName(Class> bean, Field field) {
String attr_name = SimpleName().toLowerCase() + "_"
+ Name();
return attr_name;
}
// 根据field与element获取此field对应的value
@SuppressWarnings("finally")
public static String GetAttrValue(Field field, T elem) {
String value = "";
try {
Class> type = Type();// 获取此field的类型
/*
* 下⾯依次处理 ⼋种基本类型 Timestamp类型 其他类型(带有id属性的bean类型)
*/
if (type.equals(Byte.class) || type.equals(byte.class)) {
value = Byte(elem) + "";
} else if (type.equals(Short.class) || type.equals(short.class)) { value = Short(elem) + "";
} else if (type.equals(Integer.class) || type.equals(int.class)) {
value = Int(elem) + "";
} else if (type.equals(Long.class) || type.equals(long.class)) {
value = Long(elem) + "";
} else if (type.equals(Float.class) || type.equals(float.class)) {
value = Float(elem) + "";
} else if (type.equals(Double.class) || type.equals(double.class)) { value = Double(elem) + "";
} else if (type.equals(Boolean.class) || type.equals(boolean.class)) { value = Boolean(elem) + "";
} else if (type.equals(String.class)) {
value = (String) (elem);
} else if (type.equals(Timestamp.class)) {
value = ((Timestamp) (elem)).getTime() + "";
} else {
// 如果这个类型有id这个属性,说明它是个外键
Field attr_id = DeclaredField(ATTR_ID);
// 并且此属性不为null
if (attr_id != null && (elem) != null) {
attr_id.setAccessible(true);
value = (elem)) + "";
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
return value == null ? "" : value;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论