json文字列をオブジェクトに変換
3712 ワード
ここ数年の仕事を系統的にまとめるつもりで、続々と何かを出して参考にします.
本稿では,json文字列を直接オブジェクトに変換する方法を紹介し,この方法はjson文字列の処理に大きな助けとなる.くだらないことは言わないで、コードをつけます:
コードはテスト済みで、String、int、listなどの一般的なタイプをサポートしています.jsonの解析私がここで使っているのはJSOnReaderで、依存するjarパッケージは添付ファイルを参照してください.
本稿では,json文字列を直接オブジェクトに変換する方法を紹介し,この方法はjson文字列の処理に大きな助けとなる.くだらないことは言わないで、コードをつけます:
package com.cp.utils;
/**
* :chenpeng
* E-mail:[email protected]
* :2012-7-12 02:29:57
*
*/
public class User {
private int userId;
private String userName;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
package com.cp.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Map;
import org.stringtree.json.JSONReader;
/**
* :chenpeng
* E-mail:[email protected]
* :2012-7-12 02:16:26
*
*/
public class TestUtils {
public static void main(String[] args){
String data="{\"userId\":1,\"username\":\"cp\"}";
try {
jsonDataToObj("com.cp.utils.User", data);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static Object jsonDataToObj(String type, String data) throws Exception {
Class classType = Class.forName(type);
Object object = classType.newInstance();
//
Field[] fields = classType.getDeclaredFields();
JSONReader reader = new JSONReader();
Map jsonData = null;
jsonData = (Map) reader.read(data);
int f_size = fields.length;
for (int i = 0; i < f_size; i++) {//
Field field = fields[i];
String fieldName = field.getName();
if(!jsonData.containsKey(fieldName)){
continue;
}
String stringLetter = fieldName.substring(0, 1).toUpperCase();
// setXXX
String setName = "set" + stringLetter + fieldName.substring(1);
//
Method setMethod = classType.getMethod(setName, new Class[] { field.getType() });
// setXXX()
if (jsonData.containsKey(fieldName) && (jsonData.get(fieldName)) != null && jsonData.get(fieldName).toString().trim().length() > 0) {
//
Type tp = field.getType();
if (tp.toString().equals("interface java.util.List")) {
ArrayList<String> list = new ArrayList<String>();
list.add((String) jsonData.get(fieldName));
setMethod.invoke(object, new Object[] { list });
} else if (tp.toString().indexOf("[Ljava.lang.String;") != -1) {
String tmp = (String) jsonData.get(fieldName);
String[] str = tmp.split(",");
setMethod.invoke(object, new Object[] { str });
}else if (tp.toString().indexOf("int") != -1){
setMethod.invoke(object, new Object[] { ((Long)jsonData.get(fieldName)).intValue() });
} else {
setMethod.invoke(object, new Object[] { jsonData.get(fieldName) });
}
}
}
return object;
}
}
コードはテスト済みで、String、int、listなどの一般的なタイプをサポートしています.jsonの解析私がここで使っているのはJSOnReaderで、依存するjarパッケージは添付ファイルを参照してください.