java对象与json对象的相互转换

大家好,近日我用java实现了关于java对象与json对象的简单转换,之前由于不怎么了解json,所以整个过程也相当艰难,今天成功了在这里跟大家分享一下,首先贴出源码:

convert.class

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class convert{
     public static void setProperty(Object userInfo, String userName,String value) throws Exception {  
            // 获取bean的某个属性的描述符  
            PropertyDescriptor propDesc = new PropertyDescriptor(userName, userInfo.getClass());  
            // 获得用于写入属性值的方法  
            Method methodSetUserName = propDesc.getWriteMethod();  
            // 写入属性值  
            methodSetUserName.invoke(userInfo, value);  
        }  
       // 获取bean的某个属性值  
        public static void getProperty(Object userInfo, String userName) throws Exception {  
            // 获取Bean的某个属性的描述符  
            PropertyDescriptor proDescriptor = new PropertyDescriptor(userName, userInfo.getClass());  
            // 获得用于读取属性值的方法  
            Method methodGetUserName = proDescriptor.getReadMethod();  
            // 读取属性值  
            Object objUserName = methodGetUserName.invoke(userInfo);  
            System.out.print(userName+":"+objUserName.toString()+" ");  
        }  
    //把json字符串转换成JSONArray类型
    public static JSONArray da(String json,String duixiang){
          JSONObject kj=JSONObject.fromObject(json);
          JSONArray obj=kj.getJSONArray(duixiang); 
          return obj;
      }
    //第一个参数:json要转换的java实体类对象;第二个参数:json文件转换成的JSONArray;第三个参数:json配置文件的json对象
    //该函数实现把json文件中的对象转换成java对象并输出
    public static void setPropertyByIntrospector(Object p,JSONArray ja,JSONObject ob1) throws Exception {
          // 获取bean信息
          BeanInfo beanInfo = Introspector.getBeanInfo(p.getClass());
          // 获取bean的所有属性列表
          PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();   
          ArrayList a=new ArrayList();//存储json配置文件与java实体类公共属性的String值
          Iterator iterator2 = ((JSONObject)ob1).keys();//json配置文件的keys值组
          //提取公共部分
          while(iterator2.hasNext()){
              String key=(String)iterator2.next();
              for (PropertyDescriptor propDesc : proDescrtptors) {
                  if (!(propDesc.getName().equals("class")&&propDesc.getName().equals(key))){                                 
                      a.add(key);
                      break;
                  }
              }
          }
         //从JSONArray中匹配java实体属性并输出
         for(Object p1:ja){
                Iterator iterator1 = ((JSONObject)p1).keys();//从JSONArray中取出的一个JSON对象并获取它的keys值组
                while(iterator1.hasNext()){
                    String key = (String) iterator1.next();
                          for (int i=0;i<a.size();i++) {
                              // 找到则写入属性值
                              if (ob1.getString((String)a.get(i)).equals(key)) {                                  
                                  setProperty(p,(String)a.get(i),((JSONObject)p1).getString(key));
                                  getProperty(p,(String)a.get(i));
                              }
                          }
                }
           System.out.println();
         } 
      }
      //输入一个参数文件路径,输出这个文件的内容字符串
      public static String read(String Path){
            String path=Path;//"C:/360downloads/Desktop/test.json";//这是我的json文件的路径
            //String path2= //"C:/360downloads/Desktop/config.json";//这是我的json配置文件的路径
            BufferedReader reader=null;
            StringBuilder Str=new StringBuilder();
            try 
            {
                FileInputStream fileInputStream = new FileInputStream(path);
                InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "gbk");//这里请用gbk编码,这样可以显示中文
                reader= new BufferedReader(inputStreamReader);
                String str=null;
                while((str=reader.readLine())!= null) {
                    Str.append(str);//存储json文件内容
                }
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }  
            return Str.toString();
      }
      //主函数
      public static void main(String[] args) throws IOException{                    
            String str1=read("C:/360downloads/Desktop/test.json");//把字符串内容赋值给一个字符串
            String str2=read("C:/360downloads/Desktop/config.json");//把字符串内容赋值给一个字符串
            System.out.println("输出json文件如下:");
            System.out.println(str1);
            JSONObject kj=JSONObject.fromObject(str2);
            person p=new person();
            try {
                setPropertyByIntrospector(p,da(str1,"person"),kj);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }        
}

person.class

public class person{
    String name;
    String sex;
    String age;

    public person(String name,String sex,String age){
        this.name=name;
        this.sex=sex;
        this.age=age;
    }
    public person(){name=null;sex=null;age=null;}
    public void setName(String name){
        this.name=name;
    }
    public void setSex(String sex){
        this.sex=sex;
    }
    public void setAge(String age){
        this.age=age;
    }
    public String getName(){
        return name;
    }
    public String getSex(){
        return sex;
    }
    public String getAge(){
        return age;
    }
    public String toString() {
        return "name="+name+",sex="
        +sex+",age="+age;
        }
}

我主要遇到了n个问题,总结如下:

  1. json文件的读取:这里主要注意读取文件时选择“gbk”格式即可,这样无论是中文还是英文都可以正确读取出来
  2. json文件转换成java对象:要注意转换的内容一定要是“Sting”格式
  3. 此外,person类一定要单独写在一个class文件里并声明为public类型,而且其构造方法最好写两个,一个有参,一个无参(我因为之前没写无参构造函数,出了很多莫名其妙的问题),写了就没什么问题了
  4. 一个class类中的属性不是它的所有成员变量,而是有get、set方法的成员变量,且第一个属性是“class”属性
  5. 我这里的json文件格式比较简单,即一个对象对应若干实例及其属性,例如:{ “person”:[{ “kname”:”王咯”, “ksex”: “男”, “kage”:14 } ,{ “kname”:”丽丽”, “ksex”:”女” }]},json配置文件是:{ “name”:”kname”,”sex”:”ksex”,”age”:”kage”},若你想实现更复杂的json文件转java对象,请自行改进
  6. 如果想使用本代码,只需修改一下json文件和json属性对应文件的路径(改成你自己的,json属性对应文件即你的java实体类属性与json文件key值得对应关系,用json格式写的),另外在main()函数setPropertyByIntrospector(p,da(str1,”person”),kj);这里,把da函数的第二个参数改成你json文件对象数组的key值,像上面我的就是“person”
  7. 想改动属性的话只需改动json文件、json对应关系文件和java实体类的属性即可

猜你喜欢

转载自blog.csdn.net/Chushiniudao/article/details/81391325