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 ...
随机推荐
- 帧率(FPS)计算的六种方法总结
原文地址:http://blog.csdn.net/u012494876/article/details/53368164 帧率(FPS)计算是游戏编程中常见的一个话题.大体来说,总共有如下六种方法: ...
- struts2 s:set标签
set标签是将某个值放到指定范围内, 比如说 student.teacher.parent.age 每次访问这个属性不仅性能低,而且代码可读性很差,为了解决这个问题,可以将这个值设置为一个新值,并且放 ...
- po vo
一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.使用Hibernate来生成PO是不错的选择. 二.VO:value object值对象.通常用于 ...
- 第八课:不一样的链表 linux链表设计哲学 5星级教程
这一课最后实现的链表,和普通链表不同,借鉴了linux内核链表的思想,这也是企业使用的链表. 基础介绍: 顺序表的思考 顺序表的最大问题是插入和删除需要移动大量的元素!如何解决?A:在线性表数据元素之 ...
- GPIO输出—使用固件库点亮LED
为了使工程更加有条理,我们把 LED 灯控制相关的代码独立分开存储,方便以后移植.在“工程模板”之上新建“ bsp_led.c”及“ bsp_led.h”文件,其中的“ bsp”即 BoardSupp ...
- ibatis时间比较大小
<![CDATA[ A.RFID_Time >= #StartTime# ]]>时间搜索功能 A.RFID_Time <![CDATA[ ...
- 一款基于的jQuery仿苹果样式焦点图插件
这次我们要分享的这款jQuery焦点图非常特别,它的外观特别简单,但是又相当大气.焦点图的整体样式是仿苹果样式的,由于jQuery的运用,我们只要点击图片下方的缩略图即可达到图片切换的焦点图特效,这款 ...
- java strtus2 拦截器(Interceptors)
在strtus2 中有一个比较重要的东西就是拦截器(Interceptors) 拦截器可以做到在已有的业务中插入一块共通的,比如在一个业务中,直接插入一串登录功能,就不用去每个页面一个个去显示是否登录 ...
- DevExpress v15.2新功能介绍视频(25集全)
DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...
- Android之SystemUI载入流程和NavigationBar的分析
Android之SystemUI载入流程和NavigationBar的分析 本篇仅仅分析SystemUI的载入过程和SystemUI的当中的一个模块StatusBar的小模块NavigationBar ...