XStream解析xml和json

前端之家收集整理的这篇文章主要介绍了XStream解析xml和json前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XStream是一个在我看来比较好的一个第三方包了。因为它在解析时支持注解、这样很是方便,并且xml跟json这两种格式的文件都能进行解析,XStream本属于java的一个第三方包,甚是好用,若是拿它在android开发环境,也是能正常解析,但有点美中不足,因为android开发环境时,XStream不太支持json转对象,只支持对象转json,其他xml与对象的互转都支持。这样的话双解析就有了那么一点瑕疵之处,不过话说回来,没多少需求的数据交互会用json跟xml切来切去的,当只是json转对象时,可以用Gson.jar或Jsonlib.jar或其他的json解析。XStream.jar能支持注解,又支持xml和json双解析就已经很好了。


首先来了解注解的基本使用方法

注解
@XStreamAlias别名注解
作用目标: 类,字段


@XStreamImplicit 隐式集合
@XStreamImplicit(itemFieldName="part")
作用目标: 集合字段


@XStreamConverter(SingleValueCalendarConverter.class) 注入转换器
作用目标: 对象


@XStreamAsAttribute 转换成属性
作用目标: 字段


@XStreamOmitField 忽略字段
作用目标: 字段


Auto-detect Annotations 自动侦查注解
xstream.autodetectAnnotations(true);


看下面的例子:

Student.java实体类

  1. @XStreamAlias("Student")
  2. public class Student implements Serializable{
  3. private static final long serialVersionUID = 1L;
  4.  
  5. @XStreamAlias("name")
  6. private String name;
  7. @XStreamAlias("sex")
  8. private String sex;
  9. public Student(){
  10. }
  11. public Student(String name,String sex){
  12. this.name = name;
  13. this.sex = sex;
  14. }
  15.  
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23.  
  24. public String getSex() {
  25. return sex;
  26. }
  27.  
  28. public void setSex(String sex) {
  29. this.sex = sex;
  30. }
  31. @Override
  32. public String toString() {
  33. return getClass().getSimpleName() + ":{"+"name:" + name +",sex:" + sex+"}";
  34. }
  35.  
  36. }


  1. /**
  2. * xml转bean
  3. * @param xml
  4. * @param clazz
  5. * @return
  6. */
  7. public static <T> T xmlToBean(String xml,Class<T>... clazz){
  8. T t = null;
  9. XStream xStream = new XStream(new Dom4JDriver()){ //xml转对象需要用到dom4j.jar包
  10.  
  11. @Override
  12. protected MapperWrapper wrapMapper(MapperWrapper next) {
  13. return new MapperWrapper(next) {
  14.  
  15. @Override
  16. public boolean shouldSerializeMember(Class definedIn,String fieldName) {
  17. if(definedIn == Object.class){
  18. try{
  19. return this.realClass(fieldName)!=null;
  20. }catch(Exception e){
  21. return false;
  22. }
  23. }
  24. return super.shouldSerializeMember(definedIn,fieldName);
  25. }
  26. };
  27. }
  28. };
  29. xStream.setMode(XStream.NO_REFERENCES);
  30. xStream.processAnnotations(clazz);
  31. t = (T)xStream.fromXML(xml);
  32. return t;
  33. }



  1. /**
  2. * json转bean
  3. * @param json
  4. * @param clazz
  5. * @return
  6. */
  7. public static <T> T jsonToBean(String json,Class<T>... clazz){
  8. T t = null;
  9. XStream xStream = new XStream(new JettisonMappedXmlDriver()){ //json转对象时需要用到jettison.jar包
  10.  
  11. @Override
  12. protected MapperWrapper wrapMapper(MapperWrapper next) {
  13.  
  14. return new MapperWrapper(next) {
  15.  
  16. @Override
  17. public boolean shouldSerializeMember(Class definedIn,fieldName);
  18. }
  19. };
  20. }
  21. };
  22. xStream.setMode(XStream.NO_REFERENCES);
  23. xStream.processAnnotations(clazz);
  24. t = (T)xStream.fromXML(json);
  25. return t;
  26. }


main方法测试代码

  1. public static void main(String[] args) {
  2.  
  3. String json = "{'Student':{'name':'张三','sex':'男'}}";
  4. Student student1 = jsonToBean(json,Student.class);
  5. System.out.println(student1.toString());
  6. String xml = "<?xml version='1.0' encoding='utf-8'?><Student><name>李四</name><sex>女</sex></Student>";
  7. Student student2 = xmlToBean(xml,Student.class);
  8. System.out.println(student2.toString());
  9. }

打印结果如下:
  1. Student:{name:张三,sex:男}
  2. Student:{name:李四,sex:女}

猜你在找的XML相关文章