加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

把Javav对象转换为JSON数据

(2012-08-22 17:03:44)
标签:

java

json

解析

list

object

set

map

杂谈

分类: 我的IT

  在用ajax读取数据时,反回xml文件未免太过麻烦,json成了我们不二的选择,当然了,不二也可以理解为是很二的选择,因为json数据简单明了易于解析,在这里介绍几个常用的解析方法:

  为了测试方便首先声明了一个学生类,了为与SSH框架成,进行了关联映射,使之符号我们开发环境中遇到的问题

import java.util.Date;


public class Stu {
 private int id;
 private String name;
 private int age;
 private Date birDate;
 private Classes classes;// 班级对象

 public Classes getClasses() {
  return classes;
 }

 public void setClasses(Classes classes) {
  this.classes = classes;
 }

 public Date getBirDate() {
  return birDate;
 }

 public void setBirDate(Date birDate) {
  this.birDate = birDate;
 }

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

}
而后又声明了一个班级类

import java.util.Set;

public class Classes {
 private int id;
 private String name;
 private Set<Stu> stus;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Set<Stu> getStus() {
  return stus;
 }

 public void setStus(Set<Stu> stus) {
  this.stus = stus;
 }
}
最后,看一下测试类解析事例,用JAVA自带的类进行转换需引入json-lib-2.****.jar相关jar:

 public static void main(String[] args) {
  Classes classes=new Classes();
  classes.setId(1);
  classes.setName("TS980");
  Classes classes1=new Classes();
  classes.setId(2);
  classes.setName("SS980");
  Classes classes2=new Classes();
  classes.setId(3);
  classes.setName("DS980");
  
  Stu stu=new Stu();
  stu.setId(1);
  stu.setName("小白");
  stu.setAge(20);
  stu.setClasses(classes);
  Stu stu1=new Stu();
  stu1.setId(1);
  stu1.setName("小强");
  stu1.setAge(12);
  Stu stu2=new Stu();
  stu2.setId(1);
  stu2.setName("小黑");
  stu2.setAge(21);
  
  
  Map<String,Object> jsonMap=new HashMap<String, Object>();
  jsonMap.put("count", 5);
  jsonMap.put("success", "成功!");
  jsonMap.put("stu", stu);
  JSONObject jsonObject = JSONObject.fromObject(jsonMap);//转换为JSON数据
  System.out.println(jsonObject);//输出
  
  List<Stu> slist=new ArrayList<Stu>();
  slist.add(stu);
  slist.add(stu1);
  slist.add(stu2);
  JSONArray listjson =JSONArray.fromObject(slist);//把list转换为JSON数据
  System.out.println(listjson.toString());
  
  List<Classes> clist=new ArrayList<Classes>();
  clist.add(classes);
  clist.add(classes1);
  clist.add(classes2);
  Set<Stu> stus=new HashSet<Stu>();
  stus.add(stu2);
  stus.add(stu);
  //classes.setStus(stus);
  //classes1.setStus(stus);
  JSONArray clistjson=JSONArray.fromObject(clist);
  System.out.println(clistjson);

Result

{"stu":{"age":20,"birDate":null,"classes":{"id":3,"name":"DS980","stus":[]},"id":1,"name":"小白"},"count":5,"success":"成功!"}
[{"age":20,"birDate":null,"classes":{"id":3,"name":"DS980","stus":[]},"id":1,"name":"小白"},{"age":12,"birDate":null,"classes":null,"id":1,"name":"小强"},{"age":21,"birDate":null,"classes":null,"id":1,"name":"小黑"}]
[{"id":3,"name":"DS980","stus":[]},{"id":0,"name":"","stus":[]},{"id":0,"name":"","stus":[]}]

第二种方式:写个一个公用的util类,不需引入jar。当然没有一定的功力是写不出这么NB的代码的,下面也不我写的,从网上找的NR写的代码:

import java.beans.IntrospectionException;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class JsonUtil {
 public static String object2json(Object obj) {
  StringBuilder json = new StringBuilder();
  if (obj == null) {
   json.append("\"\"");
  } else if (obj instanceof String || obj instanceof Integer
    || obj instanceof Float || obj instanceof Boolean
    || obj instanceof Short || obj instanceof Double
    || obj instanceof Long || obj instanceof BigDecimal
    || obj instanceof BigInteger || obj instanceof Byte) {
   json.append("\"").append(string2json(obj.toString())).append("\"");
  } else if (obj instanceof Object[]) {
   json.append(array2json((Object[]) obj));
  } else if (obj instanceof List) {
   json.append(list2json((List<?>) obj));
  } else if (obj instanceof Map) {
   json.append(map2json((Map<?, ?>) obj));
  } else if (obj instanceof Set) {
   json.append(set2json((Set<?>) obj));
  } else {
   json.append(bean2json(obj));
  }
  return json.toString();
 }

 public static String bean2json(Object bean) {
  StringBuilder json = new StringBuilder();
  json.append("{");
  PropertyDescriptor[] props = null;
  try {
   props = Introspector.getBeanInfo(bean.getClass(), Object.class)
     .getPropertyDescriptors();
  } catch (IntrospectionException e) {
  }
  if (props != null) {
   for (int i = 0; i < props.length; i++) {
    try {
     String name = object2json(props[i].getName());
     String value = object2json(props[i].getReadMethod().invoke(
       bean));
     json.append(name);
     json.append(":");
     json.append(value);
     json.append(",");
    } catch (Exception e) {
    }
   }
   json.setCharAt(json.length() - 1, '}');
  } else {
   json.append("}");
  }
  return json.toString();
 }

 public static String list2json(List<?> list) {
  StringBuilder json = new StringBuilder();
  json.append("[");
  if (list != null && list.size() > 0) {
   for (Object obj : list) {
    json.append(object2json(obj));
    json.append(",");
   }
   json.setCharAt(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.toString();
 }

 public static String array2json(Object[] array) {
  StringBuilder json = new StringBuilder();
  json.append("[");
  if (array != null && array.length > 0) {
   for (Object obj : array) {
    json.append(object2json(obj));
    json.append(",");
   }
   json.setCharAt(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.toString();
 }

 public static String map2json(Map<?, ?> map) {
  StringBuilder json = new StringBuilder();
  json.append("{");
  if (map != null && map.size() > 0) {
   for (Object key : map.keySet()) {
    json.append(object2json(key));
    json.append(":");
    json.append(object2json(map.get(key)));
    json.append(",");
   }
   json.setCharAt(json.length() - 1, '}');
  } else {
   json.append("}");
  }
  return json.toString();
 }

 public static String set2json(Set<?> set) {
  StringBuilder json = new StringBuilder();
  json.append("[");
  if (set != null && set.size() > 0) {
   for (Object obj : set) {
    json.append(object2json(obj));
    json.append(",");
   }
   json.setCharAt(json.length() - 1, ']');
  } else {
   json.append("]");
  }
  return json.toString();
 }

 public static String string2json(String s) {
  if (s == null)
   return "";
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < s.length(); i++) {
   char ch = s.charAt(i);
   switch (ch) {
   case '"':
    sb.append("\\\"");
    break;
   case '\\':
    sb.append("\\\\");
    break;
   case '\b':
    sb.append("\\b");
    break;
   case '\f':
    sb.append("\\f");
    break;
   case '\n':
    sb.append("\\n");
    break;
   case '\r':
    sb.append("\\r");
    break;
   case '\t':
    sb.append("\\t");
    break;
   case '/':
    sb.append("\\/");
    break;
   default:
    if (ch >= '\u0000' && ch <= '\u001F') {
     String ss = Integer.toHexString(ch);
     sb.append("\\u");
     for (int k = 0; k < 4 - ss.length(); k++) {
      sb.append('0');
     }
     sb.append(ss.toUpperCase());
    } else {
     sb.append(ch);
    }
   }
  }
  return sb.toString();
 }
}

测试代码:

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class TestJson {
 public static void main(String[] args) {
  Classes classes=new Classes();
  classes.setId(1);
  classes.setName("TS980");
  Classes classes1=new Classes();
  classes.setId(2);
  classes.setName("SS980");
  Classes classes2=new Classes();
  classes.setId(3);
  classes.setName("DS980");
  
  Stu stu=new Stu();
  stu.setId(1);
  stu.setName("小白");
  stu.setAge(20);
  stu.setClasses(classes);
  Stu stu1=new Stu();
  stu1.setId(1);
  stu1.setName("小强");
  stu1.setAge(12);
  Stu stu2=new Stu();
  stu2.setId(1);
  stu2.setName("小黑");
  stu2.setAge(21);
  
  Map<String,Object> jsonMap=new HashMap<String, Object>();
  jsonMap.put("count", 5);
  jsonMap.put("success", "成功!");
  jsonMap.put("stu", stu);
   
  List<Stu> slist=new ArrayList<Stu>();
  slist.add(stu);
  slist.add(stu1);
  slist.add(stu2);  List<Classes> clist=new ArrayList<Classes>();
  clist.add(classes);
  clist.add(classes1);
  clist.add(classes2);
  Set<Stu> stus=new HashSet<Stu>();
  stus.add(stu2);
  stus.add(stu);
  //classes.setStus(stus);
  //classes1.setStus(stus);
  System.out.println("=================JSON公用类=====================");
  String jsonObjec2t=JsonUtil.object2json(12);
  System.out.println(jsonObjec2t);
  String jsonBean=JsonUtil.bean2json(stu2);
  System.out.println(jsonBean);
  String josnMap=JsonUtil.map2json(jsonMap);
  System.out.println(josnMap);
  String jsonlist=JsonUtil.list2json(clist);
  System.out.println(jsonlist);
  String jsonSet=JsonUtil.set2json(stus);
  System.out.println(jsonSet);
  
  //classes.setStus(stus);
  //classes1.setStus(stus);
  String info=JsonUtil.object2json(clist);
  System.out.println(info);
  
 }
}
效果如下:

=================JSON公用类=====================
"12"
{"age":"21","birDate":"","classes":"","id":"1","name":"小黑"}
{"stu":{"age":"20","birDate":"","classes":{"id":"3","name":"DS980","stus":""},"id":"1","name":"小白"},"count":"5","success":"成功!"}
[{"id":"3","name":"DS980","stus":""},{"id":"0","name":"","stus":""},{"id":"0","name":"","stus":""}]
[{"age":"20","birDate":"","classes":{"id":"3","name":"DS980","stus":""},"id":"1","name":"小白"},{"age":"21","birDate":"","classes":"","id":"1","name":"小黑"}]
[{"id":"3","name":"DS980","stus":""},{"id":"0","name":"","stus":""},{"id":"0","name":"","stus":""}]
                              发现一个问题是:list集合中有set集合时无法进行解析,需把set转换为list后变成list中的一个属性才能循环。是一问题.......  希望高手指教!              抟摇直上 2012 08 22

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有