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