获取第三方的授权

   折腾了很久,终于找到了湖区第三方授权,然后通过授权,我们就可以发布一些自己想要的东西了。这里的代码,我也不是很懂,但是这个是一个独立的东西,大家如果实在不是很懂亦可以拿起去用。毕竟在我觉得,有很多代码,既然有现成的,就不必非要去弄得很透彻,只要懂大概思路以及逻辑就行了。

这里我会将代码贴出来:

  1  
  2 
  3 package cn.android.share;
  4 
  5  
  6 
  7 import java.io.File;
  8 
  9 import java.io.FileOutputStream;
 10 
 11  
 12 
 13 import cn.android.app.R;
 14 
 15 import cn.sharesdk.framework.AbstractWeibo;
 16 
 17 import cn.sharesdk.onekeyshare.ShareAllGird;
 18 
 19 import android.app.Activity;
 20 
 21 import android.content.Intent;
 22 
 23 import android.graphics.Bitmap;
 24 
 25 import android.graphics.Bitmap.CompressFormat;
 26 
 27 import android.graphics.BitmapFactory;
 28 
 29 import android.os.Bundle;
 30 
 31 import android.os.Environment;
 32 
 33 import android.view.View;
 34 
 35 import android.view.View.OnClickListener;
 36 
 37 import android.widget.Button;
 38 
 39  
 40 
 41 /**
 42 
 43  * @author yangyu 功能描述:主Activity类,程序的入口类
 44 
 45  */
 46 
 47 public class MainActivity extends Activity implements OnClickListener {
 48 
 49 // 定义图片存放的地址
 50 
 51 public static String TEST_IMAGE;
 52 
 53  
 54 
 55 // 定义"账号登陆"按钮,"有分享界面按钮","无分享界面"按钮,"得到用户资料"按钮
 56 
 57 private Button authLoginBtn, shareGuiBtn, shareBtn;
 58 
 59  
 60 
 61 @Override
 62 
 63 protected void onCreate(Bundle savedInstanceState) {
 64 
 65 super.onCreate(savedInstanceState);
 66 
 67 setContentView(R.layout.activity_main);
 68 
 69  
 70 
 71 // 初始化ShareSDK
 72 
 73 AbstractWeibo.initSDK(this);
 74 
 75  
 76 
 77 initImagePath();
 78 
 79  
 80 
 81 initView();
 82 
 83  
 84 
 85 initData();
 86 
 87 }
 88 
 89  
 90 
 91 /**
 92 
 93  * 初始化组件
 94 
 95  */
 96 
 97 private void initView() {
 98 
 99 authLoginBtn = (Button) findViewById(R.id.btnLogin);
100 
101 shareGuiBtn = (Button) findViewById(R.id.btnShareAllGui);
102 
103 shareBtn = (Button) findViewById(R.id.btnShareAll);
104 
105 // getInfoBtn = (Button) findViewById(R.id.btnUserInfo);
106 
107 }
108 
109  
110 
111 /**
112 
113  * 初始化数据
114 
115  */
116 
117 private void initData() {
118 
119 // 设置按钮监听事件
120 
121 authLoginBtn.setOnClickListener(this);
122 
123 shareGuiBtn.setOnClickListener(this);
124 
125 shareBtn.setOnClickListener(this);
126 
127 // getInfoBtn.setOnClickListener(this);
128 
129 }
130 
131  
132 
133 /**
134 
135  * 初始化分享的图片
136 
137  */
138 
139 private void initImagePath() {
140 
141 try {// 判断SD卡中是否存在此文件夹
142 
143 if (Environment.MEDIA_MOUNTED.equals(Environment
144 
145 .getExternalStorageState())
146 
147 && Environment.getExternalStorageDirectory().exists()) {
148 
149 TEST_IMAGE = Environment.getExternalStorageDirectory()
150 
151 .getAbsolutePath() + "/dic.jpg";
152 
153 } else {
154 
155 TEST_IMAGE = getApplication().getFilesDir().getAbsolutePath()
156 
157 + "/dic.jpg";
158 
159 }
160 
161 File file = new File(TEST_IMAGE);
162 
163 // 判断图片是否存此文件夹中
164 
165 if (!file.exists()) {
166 
167 file.createNewFile();
168 
169 Bitmap pic = BitmapFactory.decodeResource(getResources(),
170 
171 R.drawable.dic);
172 
173 FileOutputStream fos = new FileOutputStream(file);
174 
175 pic.compress(CompressFormat.JPEG, 100, fos);
176 
177 fos.flush();
178 
179 fos.close();
180 
181 }
182 
183 } catch (Throwable t) {
184 
185 t.printStackTrace();
186 
187 TEST_IMAGE = null;
188 
189 }
190 
191 }
192 
193  
194 
195 /**
196 
197  * 按钮监听事件
198 
199  */
200 
201 @Override
202 
203 public void onClick(View v) {
204 
205 switch (v.getId()) {
206 
207 case R.id.btnLogin:
208 
209 startActivity(new Intent(MainActivity.this, AuthActivity.class));
210 
211 break;
212 
213 case R.id.btnShareAllGui:
214 
215 showGrid(false);
216 
217 break;
218 
219 case R.id.btnShareAll:
220 
221 showGrid(true);
222 
223 break;
224 
225 // case R.id.btnUserInfo:
226 
227 // // 获取自己的资料
228 
229 // Intent i = new Intent(this, GetInforActivity.class);
230 
231 // startActivity(i);
232 
233 // break;
234 
235  default:
236 
237 break;
238 
239 }
240 
241  
242 
243 }
244 
245  
246 
247 /**
248 
249  * 使用快捷分享完成图文分享
250 
251  */
252 
253 private void showGrid(boolean silent) {
254 
255 Intent i = new Intent(this, ShareAllGird.class);
256 
257 // 分享时Notification的图标
258 
259 i.putExtra("notif_icon", R.drawable.ic_launcher);
260 
261 // 分享时Notification的标题
262 
263 i.putExtra("notif_title", this.getString(R.string.app_name));
264 
265  
266 
267 // title标题,在印象笔记、邮箱、信息、微信(包括好友和朋友圈)、人人网和QQ空间使用,否则可以不提供
268 
269 i.putExtra("title", this.getString(R.string.share));
270 
271 // titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供
272 
273 i.putExtra("titleUrl", "http://sharesdk.cn");
274 
275 // text是分享文本,所有平台都需要这个字段
276 
277 i.putExtra("text", this.getString(R.string.share_content));
278 
279 // imagePath是本地的图片路径,所有平台都支持这个字段,不提供,则表示不分享图片
280 
281 i.putExtra("imagePath", MainActivity.TEST_IMAGE);
282 
283 // url仅在微信(包括好友和朋友圈)中使用,否则可以不提供
284 
285 i.putExtra("url", "http://sharesdk.cn");
286 
287 // thumbPath是缩略图的本地路径,仅在微信(包括好友和朋友圈)中使用,否则可以不提供
288 
289 i.putExtra("thumbPath", MainActivity.TEST_IMAGE);
290 
291 // appPath是待分享应用程序的本地路劲,仅在微信(包括好友和朋友圈)中使用,否则可以不提供
292 
293 i.putExtra("appPath", MainActivity.TEST_IMAGE);
294 
295 // comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供
296 
297 i.putExtra("comment", this.getString(R.string.share));
298 
299 // site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供
300 
301 i.putExtra("site", this.getString(R.string.app_name));
302 
303 // siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供
304 
305 i.putExtra("siteUrl", "http://sharesdk.cn");
306 
307  
308 
309 // 是否直接分享
310 
311 i.putExtra("silent", silent);
312 
313 this.startActivity(i);
314 
315 }
316 
317  
318 
319 /**
320 
321  * 将action转换为String
322 
323  */
324 
325 public static String actionToString(int action) {
326 
327 switch (action) {
328 
329 case AbstractWeibo.ACTION_AUTHORIZING:
330 
331 return "ACTION_AUTHORIZING";
332 
333 case AbstractWeibo.ACTION_GETTING_FRIEND_LIST:
334 
335 return "ACTION_GETTING_FRIEND_LIST";
336 
337 case AbstractWeibo.ACTION_FOLLOWING_USER:
338 
339 return "ACTION_FOLLOWING_USER";
340 
341 case AbstractWeibo.ACTION_SENDING_DIRECT_MESSAGE:
342 
343 return "ACTION_SENDING_DIRECT_MESSAGE";
344 
345 case AbstractWeibo.ACTION_TIMELINE:
346 
347 return "ACTION_TIMELINE";
348 
349 case AbstractWeibo.ACTION_USER_INFOR:
350 
351 return "ACTION_USER_INFOR";
352 
353 case AbstractWeibo.ACTION_SHARE:
354 
355 return "ACTION_SHARE";
356 
357 default: {
358 
359 return "UNKNOWN";
360 
361 }
362 
363 }
364 
365 }
366 
367  
368 
369 protected void onDestroy() {
370 
371 // 结束ShareSDK的统计功能并释放资源
372 
373 AbstractWeibo.stopSDK(this);
374 
375 super.onDestroy();
376 
377 }
378 
379 }

,上面是第一个类,然后还有:

  1 package cn.android.share;
  2 
  3  
  4 
  5 import java.util.HashMap;
  6 
  7  
  8 
  9 import cn.android.app.R;
 10 
 11 import cn.sharesdk.framework.AbstractWeibo;
 12 
 13 import cn.sharesdk.framework.TitleLayout;
 14 
 15 import cn.sharesdk.framework.WeiboActionListener;
 16 
 17 import cn.sharesdk.renren.Renren;
 18 
 19 import cn.sharesdk.sina.weibo.SinaWeibo;
 20 
 21 import cn.sharesdk.tencent.qzone.QZone;
 22 
 23 import cn.sharesdk.tencent.weibo.TencentWeibo;
 24 
 25 import android.app.Activity;
 26 
 27 import android.os.Bundle;
 28 
 29 import android.os.Handler;
 30 
 31 import android.os.Handler.Callback;
 32 
 33 import android.os.Message;
 34 
 35 import android.view.View;
 36 
 37 import android.view.View.OnClickListener;
 38 
 39 import android.widget.CheckedTextView;
 40 
 41 import android.widget.Toast;
 42 
 43  
 44 
 45 /**
 46 
 47  * @author yangyu
 48 
 49  * 功能描述:授权和取消授权Activity,由于UI显示需要授权过的平台显示账户的名称,
 50 
 51  *   因此此页面事实上展示的是“获取用户资料”和“取消授权”两个功能。
 52 
 53  */
 54 
 55 public class AuthActivity extends Activity implements Callback, OnClickListener, WeiboActionListener {
 56 
 57 //定义CheckedTextView对象
 58 
 59 private CheckedTextView  sinaCt,qzoneCt,tengxunCt,renrenCt;
 60 
 61  
 62 
 63 //定义Handler对象
 64 
 65 private Handler handler;
 66 
 67  
 68 
 69 //定义标题栏对象
 70 
 71 private TitleLayout llTitle;
 72 
 73  
 74 
 75 @Override
 76 
 77 protected void onCreate(Bundle savedInstanceState) {
 78 
 79 super.onCreate(savedInstanceState);
 80 
 81 setContentView(R.layout.activity_auth);
 82 
 83  
 84 
 85 initView();
 86 
 87  
 88 
 89 initData();
 90 
 91 }
 92 
 93  
 94 
 95 /**
 96 
 97  * 初始化组件
 98 
 99  */
100 
101 private void initView(){
102 
103 //实例化Handler对象并设置信息回调监听接口
104 
105 handler = new Handler(this);
106 
107  
108 
109 //得到标题栏对象
110 
111 llTitle = (TitleLayout) findViewById(R.id.llTitle);
112 
113  
114 
115 //得到组件对象
116 
117 sinaCt    = (CheckedTextView)findViewById(R.id.ctvSw);
118 
119 qzoneCt   = (CheckedTextView)findViewById(R.id.ctvQz);
120 
121 tengxunCt = (CheckedTextView)findViewById(R.id.ctvTc);
122 
123 renrenCt  = (CheckedTextView)findViewById(R.id.ctvRr);
124 
125 }
126 
127  
128 
129 /**
130 
131  * 初始化数据
132 
133  */
134 
135 private void initData(){
136 
137 llTitle.getBtnBack().setOnClickListener(new OnClickListener() {
138 
139 @Override
140 
141 public void onClick(View v) {
142 
143 finish();
144 
145 }
146 
147 });
148 
149 llTitle.getTvTitle().setText("用户授权登录");
150 
151  
152 
153 //设置监听
154 
155 sinaCt.setOnClickListener(this);
156 
157 qzoneCt.setOnClickListener(this);
158 
159 tengxunCt.setOnClickListener(this);
160 
161 renrenCt.setOnClickListener(this);
162 
163  
164 
165 //获取平台列表
166 
167 AbstractWeibo[] weibos = AbstractWeibo.getWeiboList(this);
168 
169  
170 
171 for(int i = 0;i < weibos.length;i++){
172 
173 if (!weibos[i].isValid()) {
174 
175 continue;
176 
177 }
178 
179  
180 
181 CheckedTextView ctv = getView(weibos[i]);
182 
183 if (ctv != null) {
184 
185 ctv.setChecked(true);
186 
187 // 得到授权用户的用户名称
188 
189 String userName = weibos[i].getDb().get("nickname"); 
190 
191 if (userName == null || userName.length() <= 0 || "null".equals(userName)) {
192 
193 // 如果平台已经授权却没有拿到帐号名称,则自动获取用户资料,以获取名称
194 
195 userName = getWeiboName(weibos[i]);
196 
197 //添加平台事件监听
198 
199 weibos[i].setWeiboActionListener(this);
200 
201 //显示用户资料,null表示显示自己的资料
202 
203 weibos[i].showUser(null);
204 
205 }
206 
207 ctv.setText(userName);
208 
209 }
210 
211 }
212 
213 }
214 
215  
216 
217 /**
218 
219  * 在CheckedTextView组件中显示授权用户的名称
220 
221  */
222 
223 private CheckedTextView getView(AbstractWeibo weibo) {
224 
225 if (weibo == null) {
226 
227 return null;
228 
229 }
230 
231  
232 
233 String name = weibo.getName();
234 
235 if (name == null) {
236 
237 return null;
238 
239 }
240 
241  
242 
243 View v = null;
244 
245 if (SinaWeibo.NAME.equals(name)) {
246 
247 v = findViewById(R.id.ctvSw);
248 
249 }
250 
251 else if (TencentWeibo.NAME.equals(name)) {
252 
253 v = findViewById(R.id.ctvTc);
254 
255 }
256 
257 else if (Renren.NAME.equals(name)) {
258 
259 v = findViewById(R.id.ctvRr);
260 
261 }
262 
263 else if (QZone.NAME.equals(name)) {
264 
265 v = findViewById(R.id.ctvQz);
266 
267 }
268 
269  
270 
271 if (v == null) {
272 
273 return null;
274 
275 }
276 
277  
278 
279 if (! (v instanceof CheckedTextView)) {
280 
281 return null;
282 
283 }
284 
285  
286 
287 return (CheckedTextView) v;
288 
289 }
290 
291  
292 
293 /**
294 
295  * 得到授权用户的用户名称
296 
297  */
298 
299 private String getWeiboName(AbstractWeibo weibo) {
300 
301 if (weibo == null) {
302 
303 return null;
304 
305 }
306 
307  
308 
309 String name = weibo.getName();
310 
311 if (name == null) {
312 
313 return null;
314 
315 }
316 
317  
318 
319 int res = 0;
320 
321 if (SinaWeibo.NAME.equals(name)) {
322 
323 res = R.string.sinaweibo;
324 
325 }
326 
327 else if (TencentWeibo.NAME.equals(name)) {
328 
329 res = R.string.tencentweibo;
330 
331 }
332 
333 else if (Renren.NAME.equals(name)) {
334 
335 res = R.string.renren;
336 
337 }
338 
339 else if (QZone.NAME.equals(name)) {
340 
341 res = R.string.qzone;
342 
343 }
344 
345  
346 
347 if (res == 0) {
348 
349 return name;
350 
351 }
352 
353 return this.getResources().getString(res);
354 
355 }
356 
357  
358 
359 /**
360 
361  * 授权和取消授权的按钮点击监听事件
362 
363  */
364 
365 @Override
366 
367 public void onClick(View v) {
368 
369 AbstractWeibo weibo = getWeibo(v.getId());
370 
371  
372 
373 CheckedTextView ctv = (CheckedTextView) v;
374 
375 if (weibo == null) {
376 
377 ctv.setChecked(false);
378 
379 ctv.setText(R.string.not_yet_authorized);
380 
381 return;
382 
383 }
384 
385  
386 
387 if (weibo.isValid()) {
388 
389 weibo.removeAccount();
390 
391 ctv.setChecked(false);
392 
393 ctv.setText(R.string.not_yet_authorized);
394 
395 return;
396 
397 }
398 
399  
400 
401 weibo.setWeiboActionListener(this);
402 
403 weibo.showUser(null);
404 
405 }
406 
407  
408 
409 /**
410 
411  * 获得授权
412 
413  */
414 
415 private AbstractWeibo getWeibo(int vid) {
416 
417 String name = null;
418 
419 switch (vid) {
420 
421 // 进入新浪微博的授权页面
422 
423 case R.id.ctvSw:
424 
425 name = SinaWeibo.NAME;
426 
427 break;
428 
429 // 进入腾讯微博的授权页面
430 
431 case R.id.ctvTc:
432 
433 name = TencentWeibo.NAME;
434 
435 break;
436 
437 // 进入人人网的授权页面
438 
439 case R.id.ctvRr:
440 
441 name = Renren.NAME;
442 
443 break;
444 
445 // 进入QQ空间的授权页面
446 
447 case R.id.ctvQz:
448 
449 name = QZone.NAME;
450 
451 break;
452 
453 }
454 
455  
456 
457 if (name != null) {
458 
459 return AbstractWeibo.getWeibo(this, name);
460 
461 }
462 
463 return null;
464 
465 }
466 
467  
468 
469 /**
470 
471  * 授权成功的回调
472 
473  *  weibo - 回调的平台
474 
475  * action - 操作的类型
476 
477  * res - 请求的数据通过res返回
478 
479  */
480 
481 @Override
482 
483 public void onComplete(AbstractWeibo weibo, int action,
484 
485 HashMap<String, Object> arg2) {
486 
487 Message msg = new Message();
488 
489 msg.arg1 = 1;
490 
491 msg.arg2 = action;
492 
493 msg.obj = weibo;
494 
495 handler.sendMessage(msg);
496 
497  
498 
499 }
500 
501 /**
502 
503  * 授权失败的回调
504 
505  */
506 
507 @Override
508 
509 public void onError(AbstractWeibo weibo, int action, Throwable t) {
510 
511 t.printStackTrace();
512 
513  
514 
515 Message msg = new Message();
516 
517 msg.arg1 = 2;
518 
519 msg.arg2 = action;
520 
521 msg.obj = weibo;
522 
523 handler.sendMessage(msg);
524 
525 }
526 
527  
528 
529 /**
530 
531  * 取消授权的回调
532 
533  */
534 
535 @Override
536 
537 public void onCancel(AbstractWeibo weibo, int action) {
538 
539 Message msg = new Message();
540 
541 msg.arg1 = 3;
542 
543 msg.arg2 = action;
544 
545 msg.obj = weibo;
546 
547 handler.sendMessage(msg);
548 
549 }
550 
551  
552 
553 /** 
554 
555  * 处理从授权页面返回的结果
556 
557  * 
558 
559  * 如果获取到用户的名称,则显示名称;否则如果已经授权,则显示平台名称
560 
561  */
562 
563 @Override
564 
565 public boolean handleMessage(Message msg) {
566 
567 AbstractWeibo weibo = (AbstractWeibo) msg.obj;
568 
569 String text = MainActivity.actionToString(msg.arg2);
570 
571  
572 
573 switch (msg.arg1) {
574 
575 case 1: { // 成功
576 
577 text = weibo.getName() + " completed at " + text;
578 
579 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
580 
581 }
582 
583 break;
584 
585 case 2: { // 失败
586 
587 text = weibo.getName() + " caught error at " + text;
588 
589 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
590 
591 return false;
592 
593 }
594 
595 case 3: { // 取消
596 
597 text = weibo.getName() + " canceled at " + text;
598 
599 Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
600 
601 return false;
602 
603 }
604 
605 }
606 
607  
608 
609 CheckedTextView ctv = getView(weibo);
610 
611 if (ctv != null) {
612 
613 ctv.setChecked(true);
614 
615 String userName = weibo.getDb().get("nickname"); // getAuthedUserName();
616 
617 if (userName == null || userName.length() <= 0
618 
619 || "null".equals(userName)) {
620 
621 userName = getWeiboName(weibo);
622 
623 }
624 
625 ctv.setText(userName);
626 
627 }
628 
629 return false;
630 
631 }
632 
633  
634 
635 }

,当然在这里我们还需要一个辅助类(解析)

  1 package cn.android.share;
  2 
  3  
  4 
  5 import java.util.ArrayList;
  6 
  7 import java.util.HashMap;
  8 
  9 import java.util.Iterator;
 10 
 11 import java.util.Map.Entry;
 12 
 13 import org.json.JSONArray;
 14 
 15 import org.json.JSONException;
 16 
 17 import org.json.JSONObject;
 18 
 19  
 20 
 21 /**
 22 
 23  * @author yangyu
 24 
 25  * 功能描述:这是一个简易的Json-HashMap转换工具,可以将普通的json数据(字符串)
 26 
 27  * 转换为一个HashMap<Srting, Object>表格,也可以反过来操作。此外还支
 28 
 29  * 持将json数据格式化。
 30 
 31  */
 32 
 33 public class JsonUtils {
 34 
 35  
 36 
 37 /**
 38 
 39  * 将指定的json数据转成 HashMap<String, Object>对象
 40 
 41  */
 42 
 43 public HashMap<String, Object> fromJson(String jsonStr) {
 44 
 45 try {
 46 
 47 if (jsonStr.startsWith("[")
 48 
 49 && jsonStr.endsWith("]")) {
 50 
 51 jsonStr = "{"fakelist":" + jsonStr + "}";
 52 
 53 }
 54 
 55  
 56 
 57 JSONObject json = new JSONObject(jsonStr);
 58 
 59 return fromJson(json);
 60 
 61 } catch (Throwable t) {
 62 
 63 t.printStackTrace();
 64 
 65 }
 66 
 67 return new HashMap<String, Object>();
 68 
 69 }
 70 
 71  
 72 
 73 private HashMap<String, Object> fromJson(JSONObject json) throws JSONException {
 74 
 75 HashMap<String, Object> map = new HashMap<String, Object>();
 76 
 77 @SuppressWarnings("unchecked")
 78 
 79 Iterator<String> iKey = json.keys();
 80 
 81 while(iKey.hasNext()) {
 82 
 83 String key = iKey.next();
 84 
 85 Object value = json.opt(key);
 86 
 87 if (JSONObject.NULL.equals(value)) {
 88 
 89 value = null;
 90 
 91 }
 92 
 93 if (value != null) {
 94 
 95 if (value instanceof JSONObject) {
 96 
 97 value = fromJson((JSONObject)value);
 98 
 99 }
100 
101 else if (value instanceof JSONArray) {
102 
103 value = fromJson((JSONArray)value);
104 
105 }
106 
107 map.put(key, value);
108 
109 }
110 
111 }
112 
113 return map;
114 
115 }
116 
117  
118 
119 private ArrayList<Object> fromJson(JSONArray array) 
120 
121 throws JSONException {
122 
123 ArrayList<Object> list = new ArrayList<Object>();
124 
125 for (int i = 0, size = array.length(); i < size; i++) {
126 
127 Object value = array.opt(i);
128 
129 if (value instanceof JSONObject) {
130 
131 value = fromJson((JSONObject)value);
132 
133 }
134 
135 else if (value instanceof JSONArray) {
136 
137 value = fromJson((JSONArray)value);
138 
139 }
140 
141 list.add(value);
142 
143 }
144 
145 return list;
146 
147 }
148 
149  
150 
151 /**
152 
153  * 将指定的HashMap<String, Object>对象转成json数据 
154 
155  */
156 
157 public String fromHashMap(HashMap<String, Object> map) {
158 
159 try {
160 
161 return getJSONObject(map).toString();
162 
163 } catch (Throwable t) {
164 
165 t.printStackTrace();
166 
167 }
168 
169 return "";
170 
171 }
172 
173  
174 
175 @SuppressWarnings("unchecked")
176 
177 private JSONObject getJSONObject(HashMap<String, Object> map) 
178 
179 throws JSONException {
180 
181 JSONObject json = new JSONObject();
182 
183 for (Entry<String, Object> entry : map.entrySet()) {
184 
185 Object value = entry.getValue();
186 
187 if (value instanceof HashMap<?, ?>) {
188 
189 value = getJSONObject((HashMap<String, Object>)value);
190 
191 }
192 
193 else if (value instanceof ArrayList<?>) {
194 
195 value = getJSONArray((ArrayList<Object>)value);
196 
197 }
198 
199 json.put(entry.getKey(), value);
200 
201 }
202 
203 return json;
204 
205 }
206 
207  
208 
209 @SuppressWarnings("unchecked")
210 
211 private JSONArray getJSONArray(ArrayList<Object> list) 
212 
213 throws JSONException {
214 
215 JSONArray array = new JSONArray();
216 
217 for (Object value : list) {
218 
219 if (value instanceof HashMap<?, ?>) {
220 
221 value = getJSONObject((HashMap<String, Object>)value);
222 
223 }
224 
225 else if (value instanceof ArrayList<?>) {
226 
227 value = getJSONArray((ArrayList<Object>)value);
228 
229 }
230 
231 array.put(value);
232 
233 }
234 
235 return array;
236 
237 }
238 
239  
240 
241 /**
242 
243  * 格式化一个json串
244 
245  */
246 
247 public String format(String jsonStr) {
248 
249 try {
250 
251 return format("", fromJson(jsonStr));
252 
253 } catch (Throwable t) {
254 
255 t.printStackTrace();
256 
257 }
258 
259 return "";
260 
261 }
262 
263  
264 
265 @SuppressWarnings("unchecked")
266 
267 private String format(String sepStr, HashMap<String, Object> map) {
268 
269 StringBuffer sb = new StringBuffer();
270 
271 sb.append("{
");
272 
273 String mySepStr = sepStr + "	";
274 
275 int i = 0;
276 
277 for (Entry<String, Object> entry : map.entrySet()) {
278 
279 if (i > 0) {
280 
281 sb.append(",
");
282 
283 }
284 
285 sb.append(mySepStr).append('"').append(entry.getKey()).append("":");
286 
287 Object value = entry.getValue();
288 
289 if (value instanceof HashMap<?, ?>) {
290 
291 sb.append(format(mySepStr, (HashMap<String, Object>)value));
292 
293 }
294 
295 else if (value instanceof ArrayList<?>) {
296 
297 sb.append(format(mySepStr, (ArrayList<Object>)value));
298 
299 }
300 
301 else if (value instanceof String) {
302 
303 sb.append('"').append(value).append('"');
304 
305 }
306 
307 else {
308 
309 sb.append(value);
310 
311 }
312 
313 i++;
314 
315 }
316 
317 sb.append('
').append(sepStr).append('}');
318 
319 return sb.toString();
320 
321 }
322 
323  
324 
325 @SuppressWarnings("unchecked")
326 
327 private String format(String sepStr, ArrayList<Object> list) {
328 
329 StringBuffer sb = new StringBuffer();
330 
331 sb.append("[
");
332 
333 String mySepStr = sepStr + "	";
334 
335 int i = 0;
336 
337 for (Object value : list) {
338 
339 if (i > 0) {
340 
341 sb.append(",
");
342 
343 }
344 
345 sb.append(mySepStr);
346 
347 if (value instanceof HashMap<?, ?>) {
348 
349 sb.append(format(mySepStr, (HashMap<String, Object>)value));
350 
351 }
352 
353 else if (value instanceof ArrayList<?>) {
354 
355 sb.append(format(mySepStr, (ArrayList<Object>)value));
356 
357 }
358 
359 else if (value instanceof String) {
360 
361 sb.append('"').append(value).append('"');
362 
363 }
364 
365 else {
366 
367 sb.append(value);
368 
369 }
370 
371 i++;
372 
373 }
374 
375 sb.append('
').append(sepStr).append(']');
376 
377 return sb.toString();
378 
379 }
380 
381  
382 
383 }

。好了,可能大家也会有迷糊,但是我贴出了源文件。

 

一切只是为了充实自己!!stay hungry and stay foolish!!
原文地址:https://www.cnblogs.com/Catherine-Brain/p/3543772.html