java封装对象转json字符串
/**
* Copyright (c) 2011-2015, James Zhan 詹波 (jfinal@126.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.jfinal.kit; import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Record; /**
* Convert object to json string.
*
* Json java
* string java.lang.String
* number java.lang.Number
* true|false java.lang.Boolean
* null null
* array java.util.List
* object java.util.Map
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class JsonKit { private static int convertDepth = 8;
private static String timestampPattern = "yyyy-MM-dd HH:mm:ss";
private static String datePattern = "yyyy-MM-dd"; public static void setConvertDepth(int convertDepth) {
if (convertDepth < 2)
throw new IllegalArgumentException("convert depth can not less than 2.");
JsonKit.convertDepth = convertDepth;
} public static void setTimestampPattern(String timestampPattern) {
if (timestampPattern == null || "".equals(timestampPattern.trim()))
throw new IllegalArgumentException("timestampPattern can not be blank.");
JsonKit.timestampPattern = timestampPattern;
} public static void setDatePattern(String datePattern) {
if (datePattern == null || "".equals(datePattern.trim()))
throw new IllegalArgumentException("datePattern can not be blank.");
JsonKit.datePattern = datePattern;
} private static String mapToJson(Map map, int depth) {
if(map == null)
return "null"; StringBuilder sb = new StringBuilder();
boolean first = true;
Iterator iter = map.entrySet().iterator(); sb.append('{');
while(iter.hasNext()){
if(first)
first = false;
else
sb.append(','); Map.Entry entry = (Map.Entry)iter.next();
toKeyValue(String.valueOf(entry.getKey()),entry.getValue(), sb, depth);
}
sb.append('}');
return sb.toString();
} private static String toKeyValue(String key, Object value, StringBuilder sb, int depth){
sb.append('\"');
if(key == null)
sb.append("null");
else
escape(key, sb);
sb.append('\"').append(':'); sb.append(toJson(value, depth)); return sb.toString();
} private static String listToJson(List list, int depth) {
if(list == null)
return "null"; boolean first = true;
StringBuilder sb = new StringBuilder();
Iterator iter = list.iterator(); sb.append('[');
while(iter.hasNext()){
if(first)
first = false;
else
sb.append(','); Object value = iter.next();
if(value == null){
sb.append("null");
continue;
}
sb.append(toJson(value, depth));
}
sb.append(']');
return sb.toString();
} /**
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
*/
private static String escape(String s) {
if(s == null)
return null;
StringBuilder sb = new StringBuilder();
escape(s, sb);
return sb.toString();
} private static void escape(String s, StringBuilder sb) {
for(int i=0; i<s.length(); i++){
char ch = s.charAt(i);
switch(ch){
case '"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
case '/':
sb.append("\\/");
break;
default:
if((ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF')) {
String str = Integer.toHexString(ch);
sb.append("\\u");
for(int k=0; k<4-str.length(); k++) {
sb.append('0');
}
sb.append(str.toUpperCase());
}
else{
sb.append(ch);
}
}
}
} public static String toJson(Object value) {
return toJson(value, convertDepth);
} public static String toJson(Object value, int depth) {
if(value == null || (depth--) < 0)
return "null"; if(value instanceof String)
return "\"" + escape((String)value) + "\""; if(value instanceof Double){
if(((Double)value).isInfinite() || ((Double)value).isNaN())
return "null";
else
return value.toString();
} if(value instanceof Float){
if(((Float)value).isInfinite() || ((Float)value).isNaN())
return "null";
else
return value.toString();
} if(value instanceof Number)
return value.toString(); if(value instanceof Boolean)
return value.toString(); if (value instanceof java.util.Date) {
if (value instanceof java.sql.Timestamp)
return "\"" + new SimpleDateFormat(timestampPattern).format(value) + "\"";
if (value instanceof java.sql.Time)
return "\"" + value.toString() + "\"";
return "\"" + new SimpleDateFormat(datePattern).format(value) + "\"";
} if(value instanceof Map) {
return mapToJson((Map)value, depth);
} if(value instanceof List) {
return listToJson((List)value, depth);
} String result = otherToJson(value, depth);
if (result != null)
return result; // 类型无法处理时当作字符串处理,否则ajax调用返回时js无法解析
// return value.toString();
return "\"" + escape(value.toString()) + "\"";
} private static String otherToJson(Object value, int depth) {
if (value instanceof Character) {
return "\"" + escape(value.toString()) + "\"";
} if (value instanceof Model) {
Map map = com.jfinal.plugin.activerecord.CPI.getAttrs((Model)value);
return mapToJson(map, depth);
}
if (value instanceof Record) {
Map map = ((Record)value).getColumns();
return mapToJson(map, depth);
}
if (value instanceof Object[]) {
Object[] arr = (Object[])value;
List list = new ArrayList(arr.length);
for (int i=0; i<arr.length; i++)
list.add(arr[i]);
return listToJson(list, depth);
}
if (value instanceof Enum) {
return "\"" + ((Enum)value).toString() + "\"";
} return beanToJson(value, depth);
} private static String beanToJson(Object model, int depth) {
Map map = new HashMap();
Method[] methods = model.getClass().getMethods();
for (Method m : methods) {
String methodName = m.getName();
int indexOfGet = methodName.indexOf("get");
if (indexOfGet == 0 && methodName.length() > 3) { // Only getter
String attrName = methodName.substring(3);
if (!attrName.equals("Class")) { // Ignore Object.getClass()
Class<?>[] types = m.getParameterTypes();
if (types.length == 0) {
try {
Object value = m.invoke(model);
map.put(StrKit.firstCharToLowerCase(attrName), value);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
else {
int indexOfIs = methodName.indexOf("is");
if (indexOfIs == 0 && methodName.length() > 2) {
String attrName = methodName.substring(2);
Class<?>[] types = m.getParameterTypes();
if (types.length == 0) {
try {
Object value = m.invoke(model);
map.put(StrKit.firstCharToLowerCase(attrName), value);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
}
return mapToJson(map, depth);
} /**
* TODO
public static Map jsonToMap(String jsonStr) {
throw new RuntimeException("not finished");
}
*/
}
java封装对象转json字符串的更多相关文章
- <摘录>Gson对Java嵌套对象和JSON字符串之间的转换
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...
- java普通对象和json字符串的互转
一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- JackSon将java对象转换为JSON字符串
JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的writeValueA ...
- java对象与Json字符串之间的转化(fastjson)
1. 首先引入jar包 在pom.xml文件里加入下面依赖: <dependency> <groupId>com.alibaba</groupId> <art ...
- Json对象与Json字符串的转化、JSON字符串与Java对象的转换
一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...
- (后端)JackSon将java对象转换为JSON字符串(转)
转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...
- Java基础97 json插件的使用(java对象和json字符串对象之间的转换)
1.需要用到的包 2.实例 实体类 people package com.shore.entity; /** * @author DSHORE/2019-4-19 * */ public class ...
- Json对象与Json字符串的转化、JSON字符串与Java对象的转换(转)
一.Json对象与Json字符串的转化 1.jQuery插件支持的转换方式: $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符 ...
- java对象与json字符串的互相转换
java对象与json字符串的互相转换 1.采用 net.sf.json.JSONObject maven依赖包: <dependency> <groupId>net.sf.j ...
随机推荐
- nodejs初写心得
nodejs安装后如何查看和安装其他工具 网上nodejs的文章已经很多,这里只是写下自己的小小心得,如果能帮到别人当然更好. 安装nodejs这里就不叙述了,直接上nodejs官网下载就好了,初学者 ...
- java---面试题---.java"源文件中可以包括多个类(不是内部类)
答题时,先答是什么,再答有什么作用和要注意什么 一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致,main方法只能写在 ...
- LA 3266 (贪心) Tian Ji -- The Horse Racing
题意: 田忌和齐王各有n匹马,如果马的速度比齐王的快就赢200,慢则输200,相等不赔不赚. 已知两人每匹马的速度(为整数)和齐王所排出的马的顺序,问田忌该如何应对才能使收益最大. 分析: 本以为是一 ...
- linq xml读取
<?xml version="1.0" encoding="UTF-8" ?> <cache> <chatOld> < ...
- HDU 5303 Delicious Apples 美味苹果 (DP)
题意: 给一个长为L的环,起点在12点钟位置,其他位置上有一些苹果,每次带着一个能装k个苹果的篮子从起点出发去摘苹果,要将全部苹果运到起点需要走多少米? 思路: 无论哪处地方,只要苹果数超过k个,那么 ...
- Java [Leetcode 171]Excel Sheet Column Number
题目描述: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 解题思路: 循环读取数字,从左向右读取,每次该位字 ...
- Spring学习之基本概念
Spring 基本概念 Spring优点: 1.Spring不同于其它的Framework,它要提供的是一种管理你的业务对象的方法. 2.DI有效的降低了耦合度 3.AOP提供了通用任务的集中管理 4 ...
- Oracle日常维护脚本
1.正常停库流程 ps -ef|grep LOCAL=NO|cut -c 9-15|xargs kill -9 shutdown immediate; 2.备份数据库 bac ...
- TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)
在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...
- eclipse设置自定义快捷键
eclipse有很多强大且人性化的功能,而各项功能有时又隐藏得比较深(需要点击数次菜单才能找到),而系统提供的快捷键有时比较难记住甚至根本没有提供快捷键时,就需要自己手动设置快捷键了.设置方法有两种, ...