JSON和对象之前的相互转换
package com.jxjson.com; import android.util.Log; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class JsonTool { private static boolean DEBUG = false; /**
* 将JSON字符串封装到对象
*
* @param jsonStr 待封装的JSON字符串
* @param clazz 待封装的实例字节码
* @return T: 封装JSON数据的对象
* @version 1.0
*/
public static <T> T toBean(String jsonStr, Class<T> clazz) {
try {
JSONObject job = new JSONObject(jsonStr);
return parseObject(job, clazz, null);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
} /**
* 将 对象编码为 JSON格式
*
* @param t 待封装的对象
* @return String: 封装后JSONObject String格式
* @version 1.0
*/
public static <T> String toJson(T t) {
if (t == null) {
return "{}";
}
return objectToJson(t);
} /**
* 由JSON字符串生成Bean对象
*
* @param jsonStr
* @param className 待生成Bean对象的名称
* @return String:
* @version 1.0
*/
public static String createBean(String jsonStr, String className) {
try {
JSONObject job = new JSONObject(jsonStr);
return createObject(job, className, 0);
} catch (JSONException e) {
e.printStackTrace();
}
return "";
} /**
* JSONObject 封装到 对象实例
*
* @param job 待封装的JSONObject
* @param c 待封装的实例对象class
* @param v 待封装实例的外部类实例对象</br>只有内部类存在,外部类时传递null
* @return T:封装数据的实例对象
* @version 1.0
* @date 2015-10-9
*/
@SuppressWarnings("unchecked")
private static <T, V> T parseObject(JSONObject job, Class<T> c, V v) {
T t = null;
try {
if(null == v) {
t = c.newInstance();
} else {
Constructor<?> constructor = c.getDeclaredConstructors()[0];
constructor.setAccessible(true);
t = (T) constructor.newInstance(v);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
Log.e(JsonTool.class.getSimpleName(),
c.toString() + " should provide a default constructor " +
"(a public constructor with no arguments)");
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
} Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Class<?> type = field.getType();
String name = field.getName(); // if the object don`t has a mapping for name, then continue
if(!job.has(name)) continue; String typeName = type.getName();
if(typeName.equals("java.lang.String")) {
try {
String value = job.getString(name);
if (value != null && value.equals("null")) {
value = "";
}
field.set(t, value);
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
try {
field.set(t, "");
} catch (Exception e1) {
if(DEBUG)
e1.printStackTrace();
}
}
} else if(typeName.equals("int") ||
typeName.equals("java.lang.Integer")) {
try {
field.set(t, job.getInt(name));
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("boolean") ||
typeName.equals("java.lang.Boolean")) {
try {
field.set(t, job.getBoolean(name));
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("float") ||
typeName.equals("java.lang.Float")) {
try {
field.set(t, Float.valueOf(job.getString(name)));
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("double") ||
typeName.equals("java.lang.Double")) {
try {
field.set(t, job.getDouble(name));
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("long") ||
typeName.equals("java.lang.Long")) {
try {
field.set(t, job.getLong(name));
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("java.util.List") ||
typeName.equals("java.util.ArrayList")){
try {
Object obj = job.get(name);
Type genericType = field.getGenericType();
String className = genericType.toString().replace("<", "")
.replace(type.getName(), "").replace(">", "");
Class<?> clazz = Class.forName(className);
if(obj instanceof JSONArray) {
ArrayList<?> objList = parseArray((JSONArray)obj, clazz, t);
field.set(t, objList);
}
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else {
try {
Object obj = job.get(name);
Class<?> clazz = Class.forName(typeName);
if(obj instanceof JSONObject) {
Object parseJson = parseObject((JSONObject)obj, clazz, t);
field.set(t, parseJson);
}
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
} }
} return t;
} /**
* 将 JSONArray 封装到 ArrayList 对象
*
* @param array 待封装的JSONArray
* @param c 待封装实体字节码
* @param v 待封装实例的外部类实例对象</br>只有内部类存在,外部类时传递null
* @return ArrayList<T>: 封装后的实体集合
* @version 1.0
* @date 2015-10-8
*/
@SuppressWarnings("unchecked")
private static <T, V> ArrayList<T> parseArray(JSONArray array, Class<T> c, V v) {
ArrayList<T> list = new ArrayList<T>(array.length());
try {
for (int i = 0; i < array.length(); i++) {
if(array.get(i) instanceof JSONObject) {
T t = parseObject(array.getJSONObject(i), c, v);
list.add(t);
} else {
list.add((T) array.get(i));
} }
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
return list;
} /**
* 将 对象编码为 JSON格式
*
* @param t 待封装的对象
* @return String: 封装后JSONObject String格式
* @version 1.0
* @date 2015-10-11
*/
private static <T> String objectToJson(T t) { Field[] fields = t.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder(fields.length << 4);
sb.append("{"); for (Field field : fields) {
field.setAccessible(true);
Class<?> type = field.getType();
String name = field.getName(); // 'this$Number' 是内部类的外部类引用(指针)字段
if(name.contains("this$")) continue; String typeName = type.getName();
if(typeName.equals("java.lang.String")) {
try {
sb.append("\""+name+"\":");
sb.append(stringToJson((String)field.get(t)));
sb.append(",");
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("boolean") ||
typeName.equals("java.lang.Boolean") ||
typeName.equals("int") ||
typeName.equals("java.lang.Integer") ||
typeName.equals("float") ||
typeName.equals("java.lang.Float") ||
typeName.equals("double") ||
typeName.equals("java.lang.Double") ||
typeName.equals("long") ||
typeName.equals("java.lang.Long")) {
try {
sb.append("\""+name+"\":");
sb.append(field.get(t));
sb.append(",");
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else if(typeName.equals("java.util.List") ||
typeName.equals("java.util.ArrayList")){
try {
List<?> objList = (List<?>) field.get(t);
if(null != objList && objList.size() > 0) {
sb.append("\""+name+"\":");
sb.append("[");
String toJson = listToJson((List<?>) field.get(t));
sb.append(toJson);
sb.setCharAt(sb.length()-1, ']');
sb.append(",");
}
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} else {
try {
sb.append("\""+name+"\":");
sb.append("{");
sb.append(objectToJson(field.get(t)));
sb.setCharAt(sb.length()-1, '}');
sb.append(",");
} catch (Exception e) {
if(DEBUG)
e.printStackTrace();
}
} }
if(sb.length() == 1) {
sb.append("}");
}
sb.setCharAt(sb.length()-1, '}');
return sb.toString();
} /**
* 将 List 对象编码为 JSON格式
*
* @param objList 待封装的对象集合
* @return String:封装后JSONArray String格式
* @version 1.0
* @date 2015-10-11
*/
private static<T> String listToJson(List<T> objList) {
final StringBuilder sb = new StringBuilder();
for (T t : objList) {
if(t instanceof String) {
sb.append(stringToJson((String) t));
sb.append(",");
} else if(t instanceof Boolean ||
t instanceof Integer ||
t instanceof Float ||
t instanceof Double) {
sb.append(t);
sb.append(",");
} else {
sb.append(objectToJson(t));
sb.append(",");
}
}
return sb.toString();
} /**
* 将 String 对象编码为 JSON格式,只需处理好特殊字符
*
* @param str String 对象
* @return String:JSON格式
* @version 1.0
* @date 2015-10-11
*/
private static String stringToJson(final String str) {
if(str == null || str.length() == 0) {
return "\"\"";
}
final StringBuilder sb = new StringBuilder(str.length() + 2 << 4);
sb.append('\"');
for (int i = 0; i < str.length(); i++) {
final char c = str.charAt(i); sb.append(c == '\"' ? "\\\"" : c == '\\' ? "\\\\"
: c == '/' ? "\\/" : c == '\b' ? "\\b" : c == '\f' ? "\\f"
: c == '\n' ? "\\n" : c == '\r' ? "\\r"
: c == '\t' ? "\\t" : c);
}
sb.append('\"');
return sb.toString();
} /**
* 由JSONObject生成Bean对象
*
* @param job
* @param className 待生成Bean对象的名称
* @param outCount 外部类的个数
* @return LinkedList<String>: 生成的Bean对象
* @version 1.0
* @date 2015-10-16
*/
private static String createObject(JSONObject job, String className, int outCount) {
final StringBuilder sb = new StringBuilder();
String separator = System.getProperty("line.separator"); // 生成的Bean类前部的缩进空间
String classFrontSpace = "";
// 生成的Bean类字段前部的缩进空间
String fieldFrontSpace = " ";
for (int i = 0; i < outCount; i++) {
classFrontSpace += " ";
fieldFrontSpace += " ";
} sb.append(classFrontSpace + "public class " + className + " {"); Iterator<?> it = job.keys();
while (it.hasNext()) {
String key = (String) it.next();
try {
Object obj = job.get(key);
if(obj instanceof JSONArray) {
// 判断类是否为基本数据类型,如果为自定义类则字段类型取将key的首字母大写作为内部类名称
String fieldType = ((JSONArray)obj).get(0) instanceof JSONObject ?
"" : ((JSONArray)obj).get(0).getClass().getSimpleName();
if(fieldType == "") {
fieldType = String.valueOf(Character.isUpperCase(key.charAt(0)) ?
key.charAt(0) : Character.toUpperCase(key.charAt(0))) + key.substring(1);
}
sb.append(separator);
sb.append(fieldFrontSpace + "public List<" + fieldType + "> " + key + ";"); // 如果字段类型为自定义类类型,则取JSONArray中第一个JSONObject生成Bean
if(((JSONArray)obj).get(0) instanceof JSONObject) {
sb.append(separator);
sb.append(separator);
sb.append(fieldFrontSpace + "/** "+ fieldType +" is the inner class of "+ className +" */");
sb.append(separator);
sb.append(createObject((JSONObject)((JSONArray)obj).get(0), fieldType, outCount+1));
}
} else if(obj instanceof JSONObject) {
String fieldType = String.valueOf(Character.isUpperCase(key.charAt(0)) ?
key.charAt(0) : Character.toUpperCase(key.charAt(0))) + key.substring(1);
sb.append(separator);
sb.append(fieldFrontSpace + "public List<" + fieldType + "> " + key + ";");
sb.append(separator);
sb.append(separator);
sb.append(fieldFrontSpace + "/** "+ fieldType +" is the inner class of "+ className +" */");
sb.append(separator);
sb.append(createObject((JSONObject)obj, fieldType, outCount+1));
} else {
String type = obj.getClass().getSimpleName();
sb.append(separator);
sb.append(fieldFrontSpace + "public " + type + " " + key + ";");
}
} catch (JSONException e) {
e.printStackTrace();
}
} sb.append(separator);
sb.append(classFrontSpace + "}");
sb.append(separator); return sb.toString();
} }
String json = LocalFileUtils.getStringFormAsset(this, "testbean1.json");
String createBean = JsonTool.createBean(json, "TestBean1");
System.out.println(createBean);
JSON和对象之前的相互转换的更多相关文章
- C# json与对象之间的相互转换
1. 添加命名空间 using System.Runtime.Serialization.Json; 2. WriteObject方法 // 从一个对象信息生成Json串 public static ...
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
[源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...
- C# Json 和对象的相互转换
Json 和对象的相互转换 /// <summary> /// Json 和对象的相互转换 ——需引用using Newtonsoft.Json; 即:Jsonnet.net..... / ...
- 零基础学习java------26--------获取省访问量的top3,APP版本数据分析,事务,json,json字符串与对象间的相互转换,求电影平均分
一. day23中的ip,url案例(前面答案错了) 思路分析: 1.创建javabean,用来存储ip.txt各字段的信息 2. 创建java工具类,封装相应的方法 (1) 加载读取ip.txt文档 ...
- asp.net json,对象,字符串的相互转换
//object 转json格式字符串 public static string ObjectToJsonString(this object obj) { return JsonConvert.Se ...
- JSON与对象的相互转换
json是一种轻量级的数据格式,(本质为字符串) 低版本可以使用json2.js插件来解决.下载地址:https://github.com/douglascrockford/JSON-js JSON语 ...
- json和string 之间的相互转换
json和string 之间的相互转换 <script type="text/javascript"> //先认识一下js中json function showInfo ...
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...
- Newtonsoft.Json 把对象转换成json字符串
var resultJson = new { records = rowCount, page = pageindex, //总页数=(总页数+页大小-1)/页大小 total = (rowCount ...
随机推荐
- 使用while循环和伪列的存储过程
使用while循环和伪列的存储过程如下: USE [JointFrame2] GO /****** Object: StoredProcedure [dbo].[Proc_enterprise_uni ...
- php回调函数原理和实例
原理 自己调用自己 称之为“递归”,而不是回调 你也知道回调的关键是这个回既然是回,那么就有一个谁是主体的问题,因为回调是往回调用的意思我调用了函数A,而函数A在执行过程中调用了我提供的函数B,这个函 ...
- C#设置文件夹用户权限
var security = new DirectorySecurity(); string path=@"C:\temp" //设置权限的应用为文件夹本身.子文件夹及文件,所 ...
- CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header> <auth:authentication xmlns:auth="ht ...
- Selenium 之18 种定位方式
1 id 定位 driver.find_element_by_id() HTML 规定id 属性在HTML 文档中必须是唯一的.这类似于公民的身份证号,具有很强的唯一性 from selenium i ...
- yii2 beta版 执行流程
yii2 beta版 执行流程 自动加载 1.composer的自动加载 //composer的加载实现了四种方式,可以看看 require(__DIR__ . '/../../vendor/auto ...
- 李洪强iOS经典面试题34-求两个链表表示的数的和
李洪强iOS经典面试题34-求两个链表表示的数的和 问题 给你两个链表,分别表示两个非负的整数.每个链表的节点表示一个整数位. 为了方便计算,整数的低位在链表头,例如:123 在链表中的表示方式是: ...
- request的生存期只限于服务器跳转
症状: 刚才想做一个实验,在a.jsp中向request添加属性(页面编码为UTF-8),在b.jsp中删除该属性(页面编码为ISO-8859-1),通过ServletRequestAttribute ...
- PHP——数组中的each(),list()和while循环遍历数组
.while遍历 在while()语句每次循环中,each()语句将当前数组元素的键,赋给list()函数的第一个参数变量$key.并将当前数组元素中的值,赋给list()函数中的第二个参数变量$va ...
- typeof关键字
C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 使用方法 1.当x的类型为是 int 时 _min1变量的数据类型则为 int. 2.当x为一个表达式时(例 ...