a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 340|回复: 0

[专业语言] Java认证之JAVA对象转JSON格式的字符串

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证之JAVA对象转JSON格式的字符串
. ^" H  @/ D6 N* \/ V; UJAVA对象转JSON格式的字符串
; o" `& X- a+ ?8 ]8 Z5 v( RJava代码( L5 R% Z5 w/ N; o3 l. k# t0 M
package info.moogens.mvc.tools.json;
* y2 o) [( v0 x  s; I3 V" qimport java.lang.reflect.Array;8 R( a' C( F2 A
import java.lang.reflect.Field;
, K* }  [2 L6 P5 Vimport java.lang.reflect.Modifier;0 m6 [, `; p, m, H2 J
import java.util.Collection;
9 N" x7 U: q, Q8 p3 ]$ {/ Cimport java.util.HashMap;
  [4 r/ F. w0 T$ Uimport java.util.Iterator;
0 E; y2 o( J4 x6 g: V4 M0 }9 Ximport java.util.Map;
6 ^. l9 N7 f! Q" {6 t/**
2 p$ g6 \5 }% B& ?* JSON操作类* e1 Y& D+ {+ v  @+ P
* 暂时仅仅支持将java对象转储成JSON格式的字符串$ E3 u# }# I- _/ u1 ~5 S
*
0 l$ ?- i- U4 N& s$ f" a' N7 [* 原来用的 Simple Json 中的JSONValue.toJSONString 不能渲染POJO对象, 无论是使用 元注释还是实现接口 * 或多或少的都存在移植依赖性的问题。
- Y2 M' ~' l" s! W) p/ n* 而POLO对象会用在多个地方,诸如: 视图/数据库表映射[DAO]/服务层 等等
! P  l; x  I3 x' R*2 u2 m9 ~' D: T/ s6 {# u( Z
* 如果对象属于复合对象的话(非基本数据类型)可能存在效率问题,建议不使用多层次的POLO类2 w- F4 F" M/ N; `9 W* r
*0 L+ u8 I5 S# G) R: H) ]& V
* @author KenXu
) n) [6 m& M9 i* ?0 U5 O" u*
* p& m0 c+ M7 X: U1 k4 y& ]  u8 t" c*/
% q0 x9 M' L6 \& U, w* H. {3 Tpublic final class JsonSpread {
9 A; i. `% D* }% A@SuppressWarnings(“unchecked”)
6 q2 l# n* e8 ?) Opublic static String toJSONString(Object value) {
) {" R$ ^/ o8 t: m$ D/ ?: Lif (value == null) return “null”;. S* J4 B) j7 |  j1 }; F( i7 u9 Z
if (value instanceof Number) return value.toString();
, q4 U2 D0 g; l0 J9 b$ u9 g6 Jif (value instanceof Boolean) return value.toString();/ ]. Z7 }$ n& S% Q7 y
if (value instanceof String)
$ q. T8 U+ c1 J/ A+ G% F2 Nreturn “\”“ + escape((String) value) + ”\“”;, }( ^0 y! O2 k7 \/ C4 s
if (value instanceof Double) {% y4 |3 e- }; b! t: J% G9 l5 x
if (((Double) value)。isInfinite() || ((Double) value)。isNaN())
& {, [0 \# F# P; breturn “null”;
# Z+ g4 E* N, z. q& l3 \# f1 qelse
* s, [% b; R+ N/ y% Z% a6 hreturn value.toString();$ A7 O% [% J9 N
}
9 Z. }, x5 \5 C. Oif (value instanceof Float) {
2 j& M4 x7 R0 X% F0 oif (((Float) value)。isInfinite() || ((Float) value)。isNaN())
* T) r) m/ h, x$ c7 Jreturn “null”;1 ]- k6 V1 A- t$ M% O( l. S4 F
else6 c) u- y" V& i, x4 \# k
return value.toString();
, l2 L4 v% H8 B# W/ J1 a}0 y7 ]. w! R8 u' ?
if (value instanceof Map) return map2Json((Map) value);
4 ^$ j2 o$ A. Y# E' r' [% Q3 V  Yif (value instanceof Collection) return coll2Json((Collection) value);
7 U/ C0 I) T/ t4 q" O* ^if (value.getClass()。isArray()) return array2Json(value);' U& h0 k/ W! q6 P4 Y) E6 e; \$ \
return pojo2Json(value);
+ z/ ]5 k% S+ @4 Q6 c  M}) p1 M% b; s: r; F- @$ `
static String array2Json(Object array) {
  k4 F. H1 @' s9 ^: ]+ q1 s- n1 k6 E5 d) Oif (null == array) return “null” ;5 T5 v2 `# ]; Y; z) }0 I# k$ i4 l# U
StringBuffer sb = new StringBuffer();
+ r# ^6 E* b8 l; L3 s% r0 Lsb.append(‘[’);
  o$ Q( _% J" G) U" B: U// 此处减1是为了下面的 逗号 追加# u# v4 s9 B; |+ o" L1 ~
int len = Array.getLength(array) - 1;. o1 E- P& U& R0 E  d
if (len 》 -1){
8 r) J9 z: j5 y/ l* o: n) mint i ;( S5 I0 s5 c* J. [2 j' `  ~% s' [
for (i = 0; i 《 len; i++) {
3 M0 {. j( n8 B% \, |9 n9 Y# Csb.append(toJSONString(Array.get(array, i)))。append(“, ”);! K/ Z$ v6 r, p7 w+ B& p
}" V$ [/ r/ e) k, b4 c7 K& K- K( j
sb.append(toJSONString(Array.get(array, i)));
7 B  t/ t: q1 {* Z  x, c) h# N3 f}: h- k, v& R* }4 K) P- j# |) Q
sb.append(‘]’);) _& B4 \/ r$ D0 j0 W% n' w2 _6 F
return sb.toString();/ k; _. [* ?6 k# @, e0 ?
}
" a9 J$ V& }+ t. W; C8 p& ~
( q2 {& A) ^0 F/ k3 V
7 r( K( p$ x2 l$ Gstatic String coll2Json(Collection coll) {7 b$ V" B. N% F# `
if (null == coll) return “null” ;( x+ `/ H( x3 {) @
StringBuffer sb = new StringBuffer();
% h8 K( ?# |- Y) p$ Isb.append(‘[’);
+ m: P% ?2 s  zfor (Iterator it = coll.iterator(); it.hasNext();) {3 i. D/ b( y% }1 ?( x
sb.append(toJSONString(it.next()));
9 i4 t5 \3 D% A& j5 k/ u7 lif (it.hasNext())
5 ~- R0 T0 _3 f, R6 `. N8 Jsb.append(“, ”);
; z" H" F5 r- ~* c" S6 `. s: q}' Z* S) k6 x2 c8 Z( T" B
sb.append(‘]’);  F; `0 G$ N7 d8 {; m
return sb.toString();: o! o# _8 h2 F5 s" m' u$ ~! B7 f7 x
};
4 m* p8 t- N9 j. |$ G0 w' b2 Xstatic String pojo2Json(Object obj) {
' Q) R, s* Y& \& V$ j( D+ {# zClass type = obj.getClass();
! O3 u6 I) @. _) j: EField[] fields = type.getDeclaredFields();
2 e" m% p4 l* ^9 h. C( p! ?Map map = new HashMap();
' E1 I1 Z0 X% v& kfor (Field f : fields) {) i# i; b* F, S
if (Modifier.isStatic(f.getModifiers()))
0 Q% ^# L: F7 V: Scontinue;
; C# M3 t3 V& L: @8 K1 d# {String name = f.getName();! Q  _+ ?; P3 t
f.setAccessible(true);) R8 ]) u8 x. R% }+ E# j/ h+ R! V% N
Object value = null;3 c" A% U( i) O  _: {
try {
/ w& l) V1 Q& m- Rvalue = f.get(obj);/ S2 f) x8 [* v0 m" f: g+ U
} catch (Exception e) {
3 d2 C2 H1 J8 m4 T. b! a% D* D( F5 k! Svalue = null;
" j/ C* o  P( m: o4 b. i}$ l8 F: A. {2 X, m9 l( ?5 y( P
map.put(name, value);( _' L3 X: u9 W! _6 E# w& m; i5 n
}
4 Z& s( J  H% q9 H. ^3 dtype = null;fields = null;
  Y. N# |  H# M& zreturn map2Json(map);2 r$ j/ L7 R8 g
}9 @  p+ I+ t0 M1 j
@SuppressWarnings(“unchecked”)
' D  c6 `) K: {# k- A8 Lstatic String map2Json(Map map) {' Z- c8 k  E' a+ Y) q/ T: ~
if (null == map) return “null” ;$ \8 [; L* u; e) m' `
StringBuffer sb = new StringBuffer();
( n0 C1 i! I$ Csb.append(‘{’);
2 `- @0 p/ W4 g4 l) T, @( pfor (Iterator it = map.entrySet()。iterator(); it.hasNext();) {
7 i$ B* \/ {- {+ bMap.Entry entry=(Map.Entry)it.next();
2 Z" P5 `: H( r7 U, d: i$ pString key = (String)entry.getKey();1 P: i% K. M5 B& Z, W' x0 F
if (null == key) continue ;
4 Q) C2 F4 I4 O/ I& |* M; E: ~3 qsb.append(‘\“’);5 X; J7 p- I4 H. I# R7 M
escape(key,sb);
5 B# |3 w% j4 ]2 C8 H+ Qsb.append(‘\”’)。append(‘:’)。append(toJSONString(entry.getValue()));4 D6 U1 v0 I# a) x3 Z  |& r& s
if (it.hasNext())
2 w/ r* O% t- @9 r1 N% S% ysb.append(“, ”);0 j; \5 I$ \! p2 S
}
4 `% f" {- B0 K( X+ q, ~sb.append(‘}’);9 w4 L2 ?' o6 c8 b  w
return sb.toString();% m% q5 w6 E3 m" f
};
, k4 I0 a4 c& M. \/**
3 ^, b9 F$ t8 D* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F)。0 F4 p+ f+ E% H! W/ Z) X8 X' I3 T
* @param s
. Y" B" I8 e" F' I7 S* @return6 L( J$ y9 M) M+ d" ^+ E- r/ G
*/
3 s4 W% S( u- K. g- \2 C3 Opublic static String escape(String s){" ~7 ^0 p: P6 b7 e# {5 m* l6 M/ r
if(s==null)
: p3 D, W/ j* [' S" vreturn null;
1 z: \' ^: U4 E4 D3 a1 KStringBuffer sb = new StringBuffer();
" O9 R. B1 ~9 l2 |7 n; sescape(s, sb);
5 b  e/ B5 R6 v4 [- Dreturn sb.toString();3 M- {3 Y3 @/ Y! ?' s, {- C+ j
}
! L: x5 m/ r4 _, A, p1 ]# [/**
: N" X% i# }1 ]- k! S; m* @param s - Must not be null.2 Y. D" Y* F, m5 Y- }( y
* @param sb
! x6 w) q! Y7 s. d0 `2 e*/
4 R. O; M# l  S0 Astatic void escape(String s, StringBuffer sb) {
; L+ w0 h! w& k+ b& pfor (int i = 0; i 《 s.length(); i++) {0 c* |. y) f: N" ~0 \8 b
char ch = s.charAt(i);4 f8 A( N: X4 X
switch (ch) {
9 |( X" ^, o% e# icase ‘“’:
- {' @! h$ W! j3 d4 b) j( r8 qsb.append(”\\\“”);
- f. e# t1 I+ i, y4 F. N/ ]break;
( b/ z8 R9 l; N$ G; z. gcase ‘\\’:
, M. \0 I8 ^2 k+ N: B6 |sb.append(“\\\\”);
3 c- g+ @2 U! m3 [% obreak;
+ Z$ |3 J  D: _0 M
1 _. ^) I6 J! p9 f# D2 h8 H, C: k$ w" _0 ?: c, L& z8 B
case ‘\b’:! c- u$ q+ m% K! B0 v
sb.append(“\\b”);; F  D( I7 f+ p8 b& ~4 ]
break;
0 F% j/ |" m' \+ P$ U. gcase ‘\f’:
$ R5 [$ m  w: m& d- asb.append(“\\f”);8 E- W8 `. V9 k7 D4 d5 E$ U1 J
break;& q9 z& t7 v, m2 n, }
case ‘\n’:
: a* r  E! W$ T; @& e; isb.append(“\\n”);/ D: a9 r' C' j8 F& p+ U$ V
break;
+ ^% \0 }( A1 F4 \# x$ f0 [' R$ [case ‘\r’:# _  |9 d  B4 i5 P: W
sb.append(“\\r”);
5 H) U) r, T. [5 G. O8 hbreak;& R; |: c3 ]5 J8 s% }. K2 X3 H; X
case ‘\t’:
/ J$ t2 F1 X/ ^% Q" F) nsb.append(“\\t”);3 T& R! g  b$ C7 s0 [
break;
2 K0 T/ W7 `* ~; s) t7 }case ‘/’:
- J. m) R1 E- _; ]sb.append(“\\/”);# T. p5 A& y7 [
break;7 `' G6 Y$ K0 U6 m# G
default:0 c0 [0 |4 ~! R6 s  m
// Reference: http://www.unicode.org/versions/Unicode5.1.0/
6 ~: C2 @, ~( F6 Q$ Eif ((ch 》= ‘\u0000’ && ch 《= ‘\u001F’)
' b3 Z( {, G& s, @$ X' F|| (ch 》= ‘\u007F’ && ch 《= ‘\u009F’)
+ S! Q2 h% R8 o) O|| (ch 》= ‘\u2000’ && ch 《= ‘\u20FF’)) {
% g( a# O2 A7 SString ss = Integer.toHexString(ch);
, _  M2 f5 F0 H; Osb.append(“\\u”);
" }- |0 K, N! {. {5 l4 [for (int k = 0; k 《 4 - ss.length(); k++) {
0 |8 L3 C9 [% e/ J& ysb.append(‘0’);
) b' D" k0 \2 x( {7 m}
& F* Y) A4 W: g! C+ z# z1 E! ksb.append(ss.toUpperCase());
- x' j1 \, R- C/ A8 j} else {' u6 `/ Q0 q& [$ a  s' ], }
sb.append(ch);
) [' A$ N7 \8 E5 Z. g}
% x& V9 U: q8 }7 v, o; D}2 j7 Z$ I0 T" X5 l! e9 a. t& y6 l
}% V) A& Q. c2 X( J' P
}" ~/ x$ k1 N, S! R9 s1 E
}  I- C* x6 |, q  t
测试代码:( y0 f7 z% g' p' k' e9 s! ]
Java代码
( x, ^3 X2 B( ]  D0 f3 Vpackage info.moogens.mvc.tools.json;
+ H/ d' }4 A8 y4 j2 Jpublic final class User {
; h& Z) H% s% ?/ p' nprivate String name ,id;
7 V' f* d' k- |private Address ress ;$ g6 ~' D" ~$ K) K0 G
public User(){7 i) f8 A& S& X) n" Z6 D
this.name = “色色”;
: |. ?: ]! i1 e) y5 t3 N: n" u2 Ethis.id = “123”;# S+ G; O5 [  K2 h* i" K/ c
this.ress = new Address();
$ `3 u  V% a: }2 j2 Vthis.ress.setCity(“北京”);
" x% O, K+ P' L3 ]/ d5 f. w! I6 hthis.ress.setZip(10086);
9 v6 L" r) ?- g9 ~! V! R( o}7 K$ m2 l! A7 K
public String getName() {
  `1 @$ L) p" V2 F+ nreturn name;! r$ A  x8 r# K$ t
}
; r/ R8 x* l  {4 X8 S  K2 r3 hpublic void setName(String name) {2 ^" r1 _, p4 u2 ^+ C
this.name = name;
- r5 A9 G8 a) V  g% w; T5 t}
: M9 z7 V# ?" H2 h' n& spublic String getId() {
& [5 @. {# Q" w2 S! Preturn id;7 P' a) }9 ~- n  G5 C; y  C
}6 m7 e+ y" a6 F7 {
public void setId(String id) {
; Y' q* Z4 o4 H- ~1 Qthis.id = id;0 l* N: u' _& E+ F% m
}: b: n& v3 j! ~
public Address getRess() {
/ I4 t- t( a- m( E$ i1 [; O& c4 preturn ress;/ @! ~& P. F9 q. j# z7 N
}0 i6 Y) S; O2 L
public void setRess(Address ress) {
0 Q0 m8 v2 O  t( Y* F/ Zthis.ress = ress;
/ J- f$ ^# M4 ~) N, J) o& h}
- ?& C7 ~, K; m* w9 |* t9 ~  K}
+ Y9 Y. i9 {- wclass Address {6 K  @- V9 F7 n, l; x
private String city;
+ f8 D8 N# x, Tprivate int zip ;
3 v6 S3 J0 ~/ \1 r+ hpublic String getCity() {6 I! ~& }3 a5 N
return city;: n5 X9 b& R3 E/ A+ o
}
0 D2 A% |* ?: X# l2 s2 Ipublic void setCity(String city) {
# Y! }+ i+ z* T$ H' @. V0 v* r6 Gthis.city = city;
( ^, g# y& t  c# E8 |4 W* U}
' B* I6 L6 s6 H  _. ]( |# Mpublic int getZip() {
( s5 g! t. g$ g7 X& m: O* S, Kreturn zip;
! P& D7 C- c/ a}' ]7 ~6 W( I. d
public void setZip(int zip) {
) H7 c3 E3 E4 }3 ithis.zip = zip;
8 {" ^0 ~5 \9 Q: G: A- \}' d/ L+ K' M4 k  [3 U! ?
}7 R4 t' g5 Q2 U7 f% [6 r: I

+ F. H* q8 {* k# q6 S% j) a; f* r' c  |) m* E% @3 o7 B0 q' `+ R
Java代码
8 A& c9 ?# t% v+ R* spackage info.moogens.mvc.tools.json;3 u9 F1 C& o. k: M. e( m" s
import java.util.ArrayList;4 I; F/ |9 B/ d# H2 X- N
import java.util.HashMap;2 G" l* }6 N0 E# @5 C- G6 y
import java.util.List;0 i+ W2 O5 U$ B
import java.util.Map;
& b) W* _* k. {7 C+ {/ g0 Ximport info.moogens.demo.pcmaster.Application;" N. [5 u' |" _: Z& b* g
import info.moogens.mvc.tools.Toolkit;
( @3 M* p7 z# H4 a- Uimport info.moogens.mvc.web.UDI;/ f  h4 o, u4 ^% p1 O
public class X {4 w5 ?9 m, @3 l( l& o5 \
/**
  X+ y- G( Q- M* @param args( E# h1 j4 Y7 x# t
*/
: u+ h3 N! p) l& U4 F  R5 Tpublic static void main(String[] args) {( o# Q0 `" S' w0 s9 o1 T
// System.out.println((String)null);# K! ], J( [6 C0 J: U, i
System.out.println(Toolkit.toJson(UDI.parseUDIString(“/book/show”)));2 G" W9 G8 K6 Y) T' D5 A
System.out.println(Toolkit.toJson(new Application()));
7 Y1 Y* Z6 G4 I; CSystem.out.println(Toolkit.toJson(new User()));, _" u1 X7 [2 l0 }2 G* J! w% P: G: V
List list = new ArrayList();
2 ~! p+ {# z* ?0 e) d! t5 O' `list.add(“abc我是”);$ B% @3 P( d2 r( d0 E
list.add(new Integer(123));! [: k' S! M# Z0 z0 l. Q; |2 u
list.add(new Double(222.123));
8 F3 y/ t; V/ _0 z! T0 {list.add(new Boolean(true));* `: g& j7 }6 i" E) }
list.add(null);
7 n9 _$ |* `  H7 Q8 H7 V$ f+ PMap map = new HashMap();
; Y2 ^. J% ]' ?: G% q" Emap.put(“name”,“fang”);/ L1 o4 V, i1 H
map.put(“age”,new Integer(27));
* G; B! V# d6 w( xmap.put(“is_developer”,new Boolean(true));, I9 u/ r3 p2 x) m! w8 |
map.put(“weight”,new Double(60.21));2 h7 v3 E9 g' p5 k7 }
map.put(“user”,new User());# M' c- |: p9 M3 W& l( K
map.put(“list”,list);9 w, R7 F- b7 Y+ z% J2 z
int[] array = new int[5];& i" a% O8 S1 g( n. W
array[4] = 72 ;/ t4 Q5 u, X5 ?7 D* D9 q# x
array[3] = 21 ;9 h; z. s& l6 m* k5 Y3 \
array[1] = 12 ;
; \+ r" I# c0 O' [; ?, c  m/ |map.put(“array”,array);
, D8 `, ^, l1 u: m* H# XSystem.out.println(Toolkit.toJson(map));7 ]4 ^" }7 }* ?+ H5 S/ G
}6 R4 i2 t8 Z& ]+ ]/ R( C
}
' z! O; `- A5 {' Z8 U: i" @测试结果:
7 V3 ^& D" y- Y( o写道7 y8 l8 q% L7 [* t- w0 y" e% l: M
Js代码
; O8 T5 a9 U6 X# T; _{“namespace”:“default”, “action”:“show”, “controller”:“Book”}
3 n2 k6 n# _8 G{}
4 U) j: u' c8 E! V/ C{“ress”:{“zip”:10086, “city”:“北京”}, “name”:“色色”, “id”:“123”}- i# e9 ]# u3 W2 Q; e& V- V
{“list”:[“abc我是”, 123, 222.123, true, null], “user”:{“ress”:{“zip”:10086, “city”:“北京”}, “name”:“色色”, “id”:“123”}, “age”:27, “is_developer”:true, “name”:“fang”, “weight”:60.21, “array”:[0, 12, 0, 21, 72]}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-26 11:48 , Processed in 0.321560 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表