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和对象之前的相互转换的更多相关文章

  1. C# json与对象之间的相互转换

    1. 添加命名空间 using System.Runtime.Serialization.Json; 2. WriteObject方法 // 从一个对象信息生成Json串 public static ...

  2. 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换

    [源码下载] 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换 作者:webabcd 介绍速战速决 之 PHP ...

  3. C# Json 和对象的相互转换

    Json 和对象的相互转换 /// <summary> /// Json 和对象的相互转换 ——需引用using Newtonsoft.Json; 即:Jsonnet.net..... / ...

  4. 零基础学习java------26--------获取省访问量的top3,APP版本数据分析,事务,json,json字符串与对象间的相互转换,求电影平均分

    一. day23中的ip,url案例(前面答案错了) 思路分析: 1.创建javabean,用来存储ip.txt各字段的信息 2. 创建java工具类,封装相应的方法 (1) 加载读取ip.txt文档 ...

  5. asp.net json,对象,字符串的相互转换

    //object 转json格式字符串 public static string ObjectToJsonString(this object obj) { return JsonConvert.Se ...

  6. JSON与对象的相互转换

    json是一种轻量级的数据格式,(本质为字符串) 低版本可以使用json2.js插件来解决.下载地址:https://github.com/douglascrockford/JSON-js JSON语 ...

  7. json和string 之间的相互转换

    json和string 之间的相互转换 <script type="text/javascript"> //先认识一下js中json function showInfo ...

  8. .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程

    JSON作为一种轻量级的数据交换格式,简单灵活,被很多系统用来数据交互,作为一名.NET开发人员,JSON.NET无疑是最好的序列化框架,支持XML和JSON序列化,高性能,免费开源,支持LINQ查询 ...

  9. Newtonsoft.Json 把对象转换成json字符串

    var resultJson = new { records = rowCount, page = pageindex, //总页数=(总页数+页大小-1)/页大小 total = (rowCount ...

随机推荐

  1. multi-mechanize

    1. 安装 万能的pip&easy_install(python27环境) pip install multi-mechanize mechanize numpy matplotlib mec ...

  2. Android EditText 赋值与取值

    //取值 String strSmsPhone=m_txtSmsPhone.getText().toString(); //赋值 m_txtSmsPhone.setText("你好" ...

  3. sql 百分比

    select [city], bfb=cast(cast(count(*)*100./(select count(*) from [UserBasicInfo]) as decimal(10,0)) ...

  4. SQLyog之MySQL客户端的下载、安装和使用(旗舰版)(推荐)

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  5. python内置函数之__import__()

    __import__(name, globals=None, locals=None, fromlist=(), level=) 用来导入模块. >>> __import__('os ...

  6. Django rest_framework 认证源码流程

    一.请求到来后,都要先执行dispatch方法 dispatch根据请求方式的不同触发get/post/put/delete等方法 注意,APIView中的dispatch方法有很多的功能 def d ...

  7. map area 标签的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. xcode6 dyld_sim is not owned by root

    如果运行复制过来的xcode可能会这个提示,xcode6 dyld_sim is not owned by root解决方法打开终端 输入sudo xcode-select -switch /Appl ...

  9. org.apache.hadoop.hbase.DoNotRetryIOException: Class org.apache.phoenix.coprocessor.MetaDataEndpointImpl cannot be loaded Set hbase.table.sanity.checks to false at conf or table descriptor if you want

    https://stackoverflow.com/questions/38495331/apache-phoenix-unable-to-connect-to-hbase 这个坑不该啊 首选配置hb ...

  10. boa 服务的启动

    使用 buildroot 添加 boa 服务后,通过命令 boa 不能启动该服务,就研究了一下boa.conf的配置. etc/boa/boa.conf # 更改user 和Group 为root. ...