json转任意pojo

纯粹记录。

在定义消息体的时候想到一个业务,就是将消息(体json格式)和消息对象绑定起来。其实业务量不大的时候也没必要定义一个pojo来表示一条消息,json转个map也无所谓,但是用户信息多了单纯一个map不好解决,因此我还是花了点时间定义了一个json转任意pojo的工具,也方便以后用。

需要添加json解析工具

<dependency>

    <groupId>org.json</groupId>

    <artifactId>json</artifactId>

    <version>20140107</version>

</dependency>

实现过程设计反射API,别的就没啥了。

下面是具体实现,实现中也包含了json转map,list等等

package com.github.echo.common;

import
org.json.JSONArray;
import
org.json.JSONObject;

import
java.lang.reflect.Field;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;

public class
JsonHelper<T> {
 
  /**
   * json
转换为map
   * @param
json
   
* @return
   */
 
public Map<String,Object> json2Map(String json){
     Map<String,Object> result = new HashMap<String, Object>();
     
JSONObject object = new JSONObject(json);
     for
(String key:JSONObject.getNames(object)){
        result.put(key, object.get(key));
     
}
     return result;
 
}
 
  public List<Map<String,Object>> json2List(String json){
     List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
     
JSONArray array = new JSONArray(json);
//    Iterator<Object> it = array.iterator();
     
for(int i=0;i<array.length();i++){
        result.add(json2Map((array.get(i)).toString()));
     
}
//    while(it.hasNext()){
//       result.add(str2Map(((JSONObject) it.next()).toString()));
//    }
     
return result;
 
}
  /**
   * map
转换为json
   * @param
map
   
* @return
   */
 
public JSONObject map2Json(Map<String,Object> map){
     JSONObject object = new JSONObject();
     for
(String key:map.keySet()){
        object.put(key, map.get(key));
     
}
     return object;
 
}
  /**
   * list<map>
转换为json
   * @param
list
   
* @return
   */
 
public JSONArray list2Json(List<Map<String,Object>> list){
     JSONArray array = new JSONArray();
     for
(Map<String,Object> map:list){
        array.put(map2Json(map));
     
}
     return array;
 
}
  /**
   *
字符串转换成JSON
   * @param
str
   
* @return
   */
 
public JSONObject str2JsonObject(String str){
     return new JSONObject(str);
 
}
 
  public JSONArray str2JsonArray(String str){
     return new JSONArray(str);
 
}

  /**
   * json
到任意pojo的转化
   
* @param json
   
* @param clazz
   
* @return
   */
 
public T json2Pojo(String json,Class<T> clazz){
     Field[] filds = clazz.getDeclaredFields();
     
Map<String,Object> map = json2Map(json);
     try
{
        T t = clazz.newInstance();
        for
(Field f:filds){
           f.setAccessible(true);
           if
(map.containsKey(f.getName())){
              f.set(t,map.get(f.getName()));
           
}
        }
        return t;
     
} catch (Exception e) {
        e.printStackTrace();
        return null;
     
}
  }
}

核心在最后一个方法 json2Pojo。做法也很简单就是遍历要生成类的属性列表,然后把json字符串先变成结构化的map,然后一步步赋值最后返回实例就行了。这里牵扯了反射的知识我也是现学现翻的API。。。

 

"{\"sender_id\":\"sl3dv0ds9cax9s\",\"to_id\":\"14378600215406\",\"message\":\"噜啦啦噜啦啦噜啦噜啦嘞!\"}";

 给一枚json测试用。。

当然这样做好处是使用方便,解析方便,有bean做管理简单了很多。

坏处就是反射造成性能极差,测试结果光生成bean就花了大概27毫秒(查询300条数据库数据的时间还多)。

当然这里涉及的反射只是冰山一角,其实影响程度不会那么糟糕,适当利用这些机制会对给编程带来很大便利。

你可能感兴趣的:(java)